2011-09-13 39 views
0

首先,我將描述我的表結構。使用LINQ解決此問題

我有表,2列(ID和根)。此錶轉換爲節點列表,其中簡單的節點結構爲:

struct Node 
{ 
    public int id; 
    public int root; 
} 

我需要找到所有條目名單,其中有3個或更多根等於。

例子:

struct TeleDBData 
{ 
    public int ID; 
    public int? RootID; 
} 

private void InitList() 
{ 
    var eqList = new List<TeleDBData>(); 

    TeleDBData root = new TeleDBData(); 
    root.ID = 1; 

    TeleDBData node1 = new TeleDBData(); 
    node1.ID = 2; 
    node1.RootID = 1; 

    TeleDBData node2 = new TeleDBData(); 
    node2.ID = 3; 
    node2.RootID = 1; 

    TeleDBData node3 = new TeleDBData(); 
    node3.ID = 4; 
    node3.RootID = 1; 

    TeleDBData node4 = new TeleDBData(); 
    node4.ID = 5; 
    node4.RootID = 2; 

    eqList.Add(root); 
    eqList.Add(node1); 
    eqList.Add(node2); 
    eqList.Add(node3); 
    eqList.Add(node4); 
} 

運行查詢後,將返回節點1,2,3兩個節點。

我怎樣才能找到他們使用LINQ?

謝謝。

回答

4

你只需要相應GroupBy

var groups = eqList.GroupBy(n => n.RootID).Where(g => g.Count() >= 3); 

foreach (var g in groups) { 
    Console.Out.WriteLine("There are {0} nodes which share RootId = {1}", 
          g.Count(), g.Key); 
    foreach (var node in g) { 
     Console.Out.WriteLine(" node id = " + node.ID); 
    } 
} 

See it in action

附加信息

在上面的代碼,gIGrouping<int?, TeleDBData>如此,由文檔頁面的定義,它是共享一個公共密鑰(這是一個int?TeleDBData項目的集合。 groupsIEnumerable<IGrouping<int?, TeleDBData>>,所有這些都是Enumerable.GroupBy方法的標準程序。

您想要對IGrouping<,>執行的兩件事是訪問其Key屬性以查找關鍵字並枚舉它以處理分組的元素。我們在上面的代碼中完成了這兩項操作。

至於GroupBy lambda中的n,它只是依次代表eqList中的每一項;因此它的類型是TeleDBData。我選擇n作爲參數名稱作爲「節點」的縮寫。

+0

非常感謝!你能幫我理解變量'n'和'g'的類型嗎? – RHaguiuda

+0

@RHaguiuda:我編輯了答案以提供更多信息。 – Jon

+0

首先,再次感謝!其次,我很抱歉,但我現在感覺有點蠢,但我不明白爲什麼變量'n'代表eqList中的每一項。我明白'n'代表TeleDBData類型,但我不明白爲什麼它表示我的集合中的每個項目。你能再幫我一次嗎? – RHaguiuda