2017-09-29 12 views
0

私は3つのデータセットを持っています。 DataSet 1にはすべての親Idがあり、DataSet 2にはDataSet 1の子があり、DataSet 3にはDataSet3の子があります。ツリーの作成:再帰または式ツリーC#

DataSet1のIDをルートノードとして持つツリー構造のデータセットを構築したいとします。

のDataSetの1-

<NewDataSet> 
    <Table> 
     <Id>A</Id> 
     <Desc>ABC</Desc> 
    </Table> 
    <Table> 
     <Id>B</Id> 
     <Desc>DEF</Desc> 
    </Table> 
    <Table> 
     <Id>C</Id> 
     <Desc>PQR</Desc> 
    </Table> 
</NewDataSet> 

DataSetの任意のルートノードまたは場合を指定しない場合は、このようにする必要があり2 -

<NewDataSet> 
    <Table> 
     <ParentId>A</ParentId> 
     <Id>AA</Id> 
     <Desc>ABC</Desc> 
    </Table> 
    <Table> 
     <ParentId>B</ParentId> 
     <Id>BB</Id> 
     <Desc>DEF</Desc> 
    </Table> 
    <Table> 
     <ParentId>B</ParentId> 
     <Id>CB</Id> 
     <Desc>PQR</Desc> 
    </Table> 
</NewDataSet> 

のDataSetの3-

<NewDataSet> 
    <Table> 
     <ParentId>AA</ParentId> 
     <Id>AAA</Id> 
     <Desc>ABC</Desc> 
    </Table> 
    <Table> 
     <ParentId>BB</ParentId> 
     <Id>BBB</Id> 
     <Desc>DEF</Desc> 
    </Table> 
    <Table> 
     <ParentId>BB</ParentId> 
     <Id>CBB</Id> 
     <Desc>PQR</Desc> 
    </Table> 
</NewDataSet> 

の検索結果をI子ノードを必要とするかしないか:

GetTree(null、false);

<NewDataSet> 
    <Table> 
     <Id>A</Id> 
     <Desc>ABC</Desc> 
     <HasChildren>True</HasChildren> 
     <NewDataSet> 
      <Table> 
       <Id>AA</Id> 
       <Desc>ABC</Desc> 
       <HasChildren>True</HasChildren> 
       <DataSet> 
        <Table> 
         <Id>AAA</Id> 
         <Desc>ABC</Desc> 
         <HasChildren>False</HasChildren> 
        </Table>  
       </DataSet> 
      </Table> 
     </NewDataSet> 
    </Table> 
    <Table> 
    ..... //All Root Nodes and their children 
    </Table> 
</NewDataSet> 

しかし、もし私がIDを提供し、私がIDの子供を望むかどうかを指定すると、 GetTree( "BB"、true); GetBree( "BB"、false);

<NewDataSet> 
    <table> 
     <Id>BB</Id> 
     <Desc>ABC</Desc> 
     <HasChildren>True</HasChildren> 
    </table> 
</NewDataSet> 

私はこれをNested Foreachで行うことができますが、私はこの操作を実行するための再帰関数を書きたいと思います。 私はいくつかの例で2日間インターネットを検索しており、これを行うことはできません。 ウェブサイトへの参照があれば、私は多くの助けになります。

答えて

1

Foreachはおそらくまだ進んでいますが、ネストされているのではなく、各ノードごとに1回だけ使用します。

public class MyDataSet 
{ 
    public string ID {get;set;} 
    public string Description {get;set;} 
    public readonly List<MyDataSet> Children = new List<MyDataSet>(); 
    public bool HasChildren 
    { 
     get { return Children.Count > 0 } 
    } 
    public void GetTree(string id, bool includeChildren) 
    { 
     MyDataSet mySet = id == null ? this : Children.FirstOrDefault(child => child.ID == id); 

     if(mySet == null) return; 
     // TODO: handle mySet 

     if(includeChildren) 
     { 
      foreach (MyDataSet child in Children) 
      { 
       child.GetTree(null, true); 
      } 
     } 
    } 
}