Получить список отдельных элементов и их счет
У меня есть объект, который имеет много свойств, но только два, о которых нужно беспокоиться:
myobject.ID
, который является int
myobject.Names
, который является HashSet
Тогда у меня есть List
тех объектов, которые выглядят примерно так:
List<myobject>
Я использую Linq для получения некоторых данных в ретрансляторе, но я не уверен, как получить список имен и как часто они появляются.
Хотите использовать Linq, чтобы избежать необходимости перебирать данные.
Как показывают мои теги, это решение ASP.NET с использованием С#.
Некоторые пояснения:
Допустим, у меня всего три пункта в моем списке:
В пункте 1 есть Джон, Фред, Джек в своих именах.
В пункте 2 есть Джон, Фред, Джо в его именах.
В пункте 3 есть имя Джона.
Я пытаюсь вернуть следующее:
Джон - 3
Фред - 2
Джек - 1
Джо - 1
Кроме того, в качестве примечания я знаком с необходимостью писать свой собственный сравнитель для моего объекта, я просто пропускаю "как" для общего решения в своих мыслях.
Ответы
Ответ 1
Вот как я понимаю проблему, которую вы пытаетесь решить. У вас есть список myobject
s. Каждое myobject
имеет свойство Names
, которое является HashSet
of string
(т.е. HashSet<string>
). Вы хотите подсчитать количество раз, когда каждый string
, который появляется в некотором myobject.Names
, появляется во всех myobject.Names
. То есть у вас есть
"Alice", "Bob", "Charlie"
"Alice", "Bob", "Donald"
"Alice", "Donald", "Ernie"
как три myobject.Names
, и вы хотите видеть
"Alice", 3
"Bob", 2
"Charlie", 1
"Donald", 2
"Ernie", 1
Если да:
var query = list.SelectMany(x => x.Names)
.GroupBy(s => s)
.Select(g => new { Name = g.Key, Count = g.Count() });
foreach(var result in query) {
Console.WriteLine("Name: {0}, Count: {1}", result.Name, result.Count);
}
Я не вижу, какую роль играет myobject.ID
. Пожалуйста, квалифицируйтесь.
Ответ 2
var query = yourList
.SelectMany(x => x.Names)
.GroupBy(x => x, (y, z) => new { Name = y, Count = z.Count() });
// and to test...
foreach (var item in query)
{
Console.WriteLine("{0} - {1}", item.Name, item.Count);
}