2010-01-06 32 views
11

我有一个对象,具有许多特性,但只有两个担心是:获得不同项目的列表和它们的计数

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

然后,我有这些对象的List看起来类似于这样:我使用LINQ获得如此

List<myobject> 

我将数据转换为中继器,但我不确定如何获取名称列表以及它们显示的频率。

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

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

一些澄清:
可以说让我在这里仅列出三个项目: 项目1具有约翰,弗雷德,杰克在它的名字。 项目2有John,Fred,Joe的名字。第3项有John的名字。

我试图返回如下: 约翰 - 3 弗雷德 - 2 杰克 - 1 乔 - 1

此外,作为记我熟悉的有我自己写的比较器对我的目标,我只是想念我的想法中的整体解决方案的'如何'。

+1

嗨,当你说“如何获取名称列表以及它们出现频率如何”。 :你的意思是你想要计算列表中'myobject实例的数量,'.Names属性包含指向有效列表(HashSet)的指针;换句话说,'.Names属性的值不是null?或者你想创建一个'myObject'的新集合,其中只包含那些在.Names属性中带有vaid HashSet的集合?请稍后澄清一下。 – BillW 2010-01-06 02:15:47

+0

澄清补充说。 – 2010-01-06 02:21:36

回答

18

以下是我如何理解您正在尝试解决的问题。你有一个myobject s的列表。每个myobject具有称为Names的财产,其是stringHashSet(即,HashSet<string>)。您想要统计在myobject.Names中出现的每个string出现在所有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在这里扮演。请有资格。

+0

myobject.ID并没有真正发挥作用,我只是想明确说明它不是一个简单的HashSet对象。 – 2010-01-06 02:43:03

+0

好的。然后我相信上面提到了你的问题。让我知道是否需要澄清。 – jason 2010-01-06 02:45:21

+1

您的示例具有GroupBy(s),但s不存在。 – 2010-01-06 02:45:26

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); 
} 
相关问题