Работа внутри группы LINQ

169
05 декабря 2018, 07:30

столкнулся с проблемой. Необходимо сделать сортировку, подсчет и удаление повторяющихся элементов(только после подсчета) внутри группы. Есть входная последовательность, скажем"(aaa aa bbb bb ddd dd)". Необходимо сделать группы, ключ будет первая буква строки. Это все сделал посредством Split и LINQ

String[] s = list[0].ToLower().Split(new char[] { ' ', '.', ',' }, StringSplitOptions.RemoveEmptyEntries);
var words = s.GroupBy(t => t.Substring(0, 1)).Select(alf => new { Name = alf.Key, Count = alf.Count(), Full = alf.Select(t => t) }).OrderBy(alf=>alf.Name);

Подскажите, как работать с данными внутри группы.

Пример входной последовательности:

aAaa aa vvv vv aaaa bbBb, vvv. D vvv dd

Пример выходной последовательности

a

aaaa 2

aa 1

b

bbbb 1

d

d 1

dd 1

v

vvv 3

vv 1

Answer 1

Вам нужна по сути группировка внутри групп, ничего сложного, но получается чуть более громоздко и надо чуть больше держать в голове и быть внимательным:

var source = "aAaa aa vvv vv aaaa bbBb, vvv. D vvv dd";
var words = source.ToLower().Split(" .,".ToCharArray(),
                                   StringSplitOptions.RemoveEmptyEntries);
var groups = words.GroupBy(w => w[0])
                  .Select(g => new {
                      key = g.Key,
                      content = g.GroupBy(w => w)
                                 .Select(c => new { word = c.Key, count = c.Count() })
                                 //.OrderByDescending(b => b.word.Length)
                                 .ToList()
                  })
                  .OrderBy(a => a.key)
                  .ToList();
foreach (var a in groups)
{
    Console.WriteLine(a.key);
    foreach (var b in a.content)
    {
        Console.WriteLine(b.word + " " + b.count);
    }
}
Answer 2

Можно сделать то же самое, но чуть чуть попроще

var result = words.GroupBy(x=>x).GroupBy(x=>x.Key[0]).OrderBy(x=>x.Key);    
foreach(var r in result)
{
    Console.WriteLine(r.Key);               
    foreach(var g in r)
    {
        Console.WriteLine($"{g.Key} {g.Count()}");
    }
}
READ ALSO
Как подключить файл для чтения через консоль?

Как подключить файл для чтения через консоль?

Как подключить файл для чтения через консоль, чтобы не в коде передавать адрес файла

172
API Яндекс.Касса: про создание платежа

API Яндекс.Касса: про создание платежа

Сайт на движке, но не магазин, поэтому готовый модуль использовать не получится, обратился к документации, API v3 (новые площадки подключаются...

135
Задача с ассоциативным массивом

Задача с ассоциативным массивом

В массиве есть авторы и книги, у каждой книги один автор

157
Загрузка ajax данных в модалку

Загрузка ajax данных в модалку

Вообщем есть проект на yii2 и там выводятся пользователи в gridview

156