簡體   English   中英

創建樹:遞歸或表達式樹C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM