LINQ, сгруппировать с сохранением порядка
От: Vetal_ca Канада http://vetal.ca
Дата: 07.02.09 16:04
Оценка:
Толко начинаю разбираться с LINQ, не могу додумать,


есть набор данных с ключами:


(3,a)(3,b)(3,c)(5,d)(5,e)(3,f)

Если сгруппировать по ключу (первому числу), то возвратит 2 группы:


Группа 1: Key = 3, (a-b-c-f)
Группа 2: Key = 5, (d-e)

Нужно сгруппировать так, чтобы получилось nhb

Группа 1: Key = 3, (a-b-c)
Группа 2: Key = 5, (d-e)
Группа 3: Key = 3, (f)

Спасибо
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...
Пока на собственное сообщение не было ответов, его можно удалить.