创建树:递归或表达式树C#

时间:2017-09-29 15:53:48

标签: c# recursion data-structures tree

我有三个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天的一些例子而且无法做到这一点。 任何对网站的引用也会对我有所帮助。

1 个答案:

答案 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);
            }
        }
    }
}