Там нет ничего в рамках, чтобы сделать это.Если вам не нужен фактический IGrouping<,>
, вы можете использовать это:
static IEnumerable<IList<TElement>> GroupByChanges<TElement, TKey>
(this IEnumerable<TElement> source,
Func<TElement, TKey> projection)
{
// TODO: Argument validation, splitting this into two methods
// to achieve eager validation.
// TODO: Allow a custom comparer to be used, possibly even
// an IComparer<T> instead of an IEqualityComparer<T>
IEqualityComparer<TKey> comparer = EqualityComparer<TKey>.Default;
using (IEnumerator<TElement> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
TKey currentKey = projection(iterator.Current);
IList<TElement> currentList = new List<TElement> { iterator.Current };
while (iterator.MoveNext())
{
TKey key = projection(iterator.Current);
if (!comparer.Equals(currentKey, key))
{
yield return currentList;
currentList = new List<TElement>();
}
currentList.Add(iterator.Current);
}
yield return currentList;
}
}
Если вам нужна полная реализация IGrouping<,>
, это будет немного сложнее - но вы всегда можете взять мой Реализация Edulinq .
Реализация GroupByChanges
изменилась бы очень мало - просто измените назначения currentList
, чтобы передать ключ конструктору Grouping
:
Grouping<TKey, TElement> currentGroup = new Grouping<TKey, TElement>(currentKey)
{ iterator.Current };