Вопрос:

Linq: группировка с неуникальным ключом (сохранение порядка)

linq

54 просмотра

2 ответа

7428 Репутация автора

Предположим, что список похож на aaabbacccaa, как мне получить группы {aaa} - {bb} - {a} - {ccc} - {aa}?

Так что я не хочу: {aaaaaa} - {bb} - {ccc}.

Автор: Gerard Источник Размещён: 28.12.2017 01:13

Ответы (2)


1 плюс

10123 Репутация автора

Попробуйте следующий код;

var list = new List<string>
{
    "a","a","a","b","b","a","c","c","c","a","a"
};
int index = 0;
string lastItem = "";
var groupedList = 
    list
    .Select(x =>
    {
        if (lastItem != x)
        {
            index++;
            lastItem = x;
        }
        return new { Item = x,Index = index };
    })
    .GroupBy(grp => grp)
    .Select(grp => grp.Select(x => x.Item).ToList())
    .ToList();

Выход

a,a,a
b,b
a
c,c,c
a,a
Автор: lucky Размещён: 28.12.2017 08:46

1 плюс

7428 Репутация автора

Решение
    public static List<(string key, List<T> items)> GroupByConsecutive<T>( 
          IEnumerable<T> items,   
          Func<T, string> key)
    {
        var list = new List<(string key, List<T> items)>();

        foreach (var item in items)
        {
            if (list.Count == 0 || list.Last().key != key(item))
            {
                list.Add((key(item), new List<T> { item }));
            }
            else
            {
                list.Last().items.Add(item);
            }
        }

        return list;
    }
Автор: Gerard Размещён: 20.05.2019 07:40
Вопросы из категории :
32x32