2010-01-06 28 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); 
} 
相關問題