Получить список отдельных элементов и их счет

У меня есть объект, который имеет много свойств, но только два, о которых нужно беспокоиться:

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);
}