2011-09-13 19 views
0

まず、テーブル構造について説明します。LINQを使用してこの問題を解決する

私は2列(IDとルート)のテーブルを持っています。私は3つの以上の根の等号があります。このリスト内のすべてのエントリを検索する必要がある

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

:このテーブルは、簡単なノード構造があるノードのリストに変換されます。

例:

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

追加情報:上記のコードで

gはそうIGrouping<int?, TeleDBData>で、ドキュメントのページ定義で、それは(int?ある)共通鍵を共有するTeleDBDataアイテムのコレクションです。 groupsIEnumerable<IGrouping<int?, TeleDBData>>であり、これはすべてEnumerable.GroupByメソッドの標準手順です。

IGrouping<,>で行うことをお勧めしたいのは、キーを見つけてグループ化された要素を処理する列挙型のKeyプロパティにアクセスすることです。上記のコードでは、この両方を行っています。

ラムダのnGroupByで、単にeqListの各項目を表しています。そのタイプはTeleDBDataです。私はnを "node"の省略形としてパラメータ名として選んだ。

+0

ありがとう!あなたは変数nとgの型を理解するのを助けることができますか? – RHaguiuda

+0

@RHaguiuda:私はいくつかの情報を提供するために答えを編集しました。 – Jon

+0

まずは、ありがとう!第二に、私は申し訳ありませんが、今は少しばかげている気がしますが、なぜ変数 'n'がeqListの各項目を表すのか理解できません。私は 'n'がTeleDBData型を表していることを理解していましたが、なぜそれがコレクションの各アイテムを表すのか理解できません。もう一度手伝ってもらえますか? – RHaguiuda

関連する問題