Получить сгруппированные значения, разделенные запятыми, с помощью linq

Я хотел бы третий столбец «элементы» со значениями, которые сгруппированы.

var dic = new Dictionary<string, int>();
dic.Add("a", 1);
dic.Add("b", 1);
dic.Add("c", 2);
dic.Add("d", 3);

var dCounts =
    (from i in dic
    group i by i.Value into g
    select new { g.Key, count = g.Count()});

    var a = dCounts.Where(c => c.count>1 );

dCounts.Dump();
a.Dump();

Этот код приводит к:

Key Count
1   2
2   1
3   1

Я хотел бы эти результаты:

Key Count Items
1   2     a, b
2   1     c
3   1     d

person Micah B.    schedule 13.07.2010    source источник


Ответы (3)


    var dCounts =
        (from i in dic
            group i by i.Value into g
            select new { g.Key, count = g.Count(), Items = string.Join(",", g.Select(kvp => kvp.Key)) });

Используйте string.Join(",", {array}), передав свой массив ключей.

person Matthew Abbott    schedule 13.07.2010
comment
если мы используем string.Join, то получение исключения, такого как Linq для сущностей, не распознает метод string.Join - person reddy39; 01.12.2017

Вы можете использовать:

var dCounts = 
    from i in dic 
    group i by i.Value into g 
    select new { g.Key, Count = g.Count(), Values = g }; 

Результат, созданный группировкой (значение g), имеет свойство Key, которое дает вам ключ, но также реализует IEnumerable<T>, позволяющее получить доступ к отдельным значениям в группе. Если вы возвращаете только g, вы можете перебрать все значения, используя foreach, или обработать их с помощью LINQ.

Вот простая функция дампа, чтобы продемонстрировать это:

foreach(var el in dCounts) {
  Console.Write(" - {0}, count: {1}, values:", el.Key, el.Count);
  foreach(var item in el.Values) Console.Write("{0}, ", item);
|
person Tomas Petricek    schedule 13.07.2010

person    schedule
comment
Это не сработает, потому что EF не может распознать строку метода С#. - person Lab Lab; 26.02.2019
comment
@LabLab Исходный вопрос не касается EF. Если у вас есть вопрос об EF, задайте его. - person Amy B; 27.02.2019
comment
Проще говоря: я ничего не могу поделать, если команда Microsoft Data не может присоединиться к языковой интеграции. Они сделали EF отдельной вещью со своим диссонансом. У нас здесь разговор LINQ, а не EF. - person Amy B; 27.02.2019