Re: LINQ, сгруппировать с сохранением порядка
От: denominator  
Дата: 07.02.09 19:30
Оценка: 6 (1)
LINQ не предназначен для таких задач. Но если сильно хочется, то можно :

private class Grouping<TKey, TElement>: Collection<TElement>, IGrouping<TKey, TElement>
{
    public TKey Key { get; set; }
}

public static IEnumerable<IGrouping<TKey, TSource>> SplitBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    Grouping<TKey, TSource> currentGroup = null;

    foreach (TSource item in source)
    {
        TKey key = keySelector(item);

        if (currentGroup != null && !currentGroup.Key.Equals(key))
        {
            yield return currentGroup;
            currentGroup = null;
        }

        if (currentGroup == null)
        {
            currentGroup = new Grouping<TKey, TSource>() { Key = key };
        }

        currentGroup.Add(item);
    }

    if (currentGroup != null)
    {
        yield return currentGroup;
    }
}

Использовать примерно так:

var result = data.SplitBy(item => item.key);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.