我有一个对象,它有许多属性但只有两个需要担心的是:
myobject.ID
这是一个int
myobject.Names
这是HashSet
然后我有List
个看起来与此类似的对象:
List<myobject>
我使用Linq将一些数据转换为转发器,但我不确定如何获取名称列表以及它们出现的频率。
想要使用Linq来避免循环访问数据。
正如我的标签应该显示的那样,这是一个使用C#的ASP.NET解决方案。
一些澄清:
假设我的列表中只有三个项目:
第1项有约翰,弗雷德,杰克的名字。
第2项有John,Fred,Joe的名字。
第3项以约翰的名义命名。
我正在尝试返回以下内容: 约翰 - 3 弗雷德 - 2 杰克 - 1 乔 - 1
另外,作为一个注释我熟悉必须为我的对象编写自己的比较器,我只是错过了我的想法中整体解决方案的“如何”。
答案 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);
}