[英]Create Tree : Recursion or Expression Tree C#
我有三個數據集。 DataSet 1具有所有父ID,DataSet 2具有DataSet 1的子代,DataSet 3具有DataSet3的子代。
我想使用ID為DataSet1的根節點構建樹狀結構的數據集。
數據集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>
數據集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>
數據集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>
結果如果未指定任何根節點,或者是否需要子節點,則應該是這樣的:
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);
<NewDataSet>
<table>
<Id>BB</Id>
<Desc>ABC</Desc>
<HasChildren>True</HasChildren>
<DataSet>
<Table>
<Id>BBB</Id>
<Desc>ABC</Desc>
<HasChildren>False</HasChildren>
</Table>
<Table>
<Id>CBB</Id>
<Desc>PQR</Desc>
<HasChildren>False</HasChildren>
</Table>
</DataSet>
</table>
</NewDataSet>
GetTree(“ BB”,false);
<NewDataSet>
<table>
<Id>BB</Id>
<Desc>ABC</Desc>
<HasChildren>True</HasChildren>
</table>
</NewDataSet>
我知道我可以使用嵌套的Foreach做到這一點,但是我想編寫一個遞歸函數來執行此操作。 我已經在互聯網上搜索了2天,以獲取一些示例,但無法執行此操作。 對網站的任何引用也會對我有很大幫助。
Foreach可能仍然是要走的路,但您不必為每個嵌套節點使用嵌套一次,而是對其進行嵌套。
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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.