获取不同项目及其计数的列表

时间:2010-01-06 02:08:48

标签: c# asp.net linq linq-to-objects

我有一个对象,它有许多属性但只有两个需要担心的是:

myobject.ID这是一个int
myobject.Names这是HashSet

然后我有List个看起来与此类似的对象:

List<myobject>

我使用Linq将一些数据转换为转发器,但我不确定如何获取名称列表以及它们出现的频率。

想要使用Linq来避免循环访问数据。

正如我的标签应该显示的那样,这是一个使用C#的ASP.NET解决方案。

一些澄清:
假设我的列表中只有三个项目: 第1项有约翰,弗雷德,杰克的名字。 第2项有John,Fred,Joe的名字。 第3项以约翰的名义命名。

我正在尝试返回以下内容: 约翰 - 3 弗雷德 - 2 杰克 - 1 乔 - 1

另外,作为一个注释我熟悉必须为我的对象编写自己的比较器,我只是错过了我的想法中整体解决方案的“如何”。

2 个答案:

答案 0 :(得分:20)

以下是我如何理解您要解决的问题。您有一个myobject的列表。每个myobject都有一个名为Names的属性,它是HashSet的{​​{1}}(即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在这里扮演的角色。请符合资格。

答案 1 :(得分:5)

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