我有三个DataSet。 DataSet 1具有所有父ID,DataSet 2具有DataSet 1的子项,DataSet 3具有DataSet3的子项。
我想构建一个树状结构的DataSet,其中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>
结果如果不指定任何根节点或者我是否想要子节点,则应该是这样的:
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的孩子。 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>
我知道我可以使用Nested Foreach执行此操作,但我想编写一个递归函数来执行此操作。 我现在已经在互联网上搜索了2天的一些例子而且无法做到这一点。 任何对网站的引用也会对我有所帮助。
答案 0 :(得分:1)
Foreach可能仍然是可行的方法,但不是嵌套,而是只为每个节点使用一次&#39;。
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);
}
}
}
}