Получить список отдельных предметов и их количество - PullRequest
12 голосов
/ 06 января 2010

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

myobject.ID, что int
myobject.Names, что HashSet

Тогда у меня есть List из этих объектов, которые выглядят примерно так:

List<myobject>

Я использую Linq для передачи некоторых данных в ретранслятор, но я не уверен, как получить список имен и как часто они появляются.

Хотите использовать Linq, чтобы избежать необходимости перебирать данные.

Как показывают мои теги, это решение ASP.NET с использованием C #.

Некоторые уточнения:
Допустим, в моем списке всего три элемента: У пункта 1 есть Джон, Фред, Джек в его именах. У пункта 2 есть Джон, Фред, Джо в его именах. У пункта 3 есть Джон в его именах.

Я пытаюсь вернуть следующее: Джон - 3 Фред - 2 Джек - 1 Джо - 1

Также, как примечание, я знаком с необходимостью написать свой собственный компаратор для моего объекта, я просто упускаю «как» для общего решения в моих мыслях.

Ответы [ 2 ]

20 голосов
/ 06 января 2010

Вот как я понимаю проблему, которую вы пытаетесь решить. У вас есть список myobject с. Каждый myobject имеет свойство, называемое Names, которое является HashSet из 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 играет здесь. Пожалуйста, уточняйте.

5 голосов
/ 06 января 2010
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);
}
...