Я хотел бы третий столбец "объекты" со значениями, которые сгруппированы.
Dictionary<string, int> 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
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})
, передав свой массив ключей.
Вы можете использовать:
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);
|
from i in dic
group i.Key by i.Value into g
select new
{
g.Key,
count = g.Count(),
items = string.Join(",", g.ToArray())
});