递归对象生成器。值正在替换以前的值

时间:2017-03-21 16:42:29

标签: c# list recursion

我的递归功能有问题。

Collection.Add(RecursiveTreeBuilder(myList));

public TreeNodeItem RecursiveTreeBuilder(List<TestObject> pList)
    {
        if (pList == null)
            return null;

        TreeNodeItem _node = new TreeNodeItem();
        for (int x=0; x<pList.Count; x++)
        {
            _node.Header = pList[x].Name;
            _node.Children.Add(RecursiveTreeBuilder(pList[x].Children));
        }

        return _node;
    }

Fuction应该做的是返回一个节点,该节点在该节点内有一个基于原始列表的节点列表。

它只能在每个列表中保留最终节点。

帮助:)

2 个答案:

答案 0 :(得分:1)

想想当你的功能自我调用时你正在做什么:你每次都会传递所有pList[x]个孩子。您要做的是将一个 TestObject传递给RecursiveTreeBuilder,然后为该特定TestObject创建一个新的树节点。然后,对于TestObject的每个子项,您希望为该子项创建子新树节点并将其添加到树节点。

您想要一个方法,只需一个TestObject并返回一个TreeNodeItem。无论如何,这是一般情况,也是最简单的方法。您最初的无标题List<TestObject>是特例 - 所以为此写一个不同的重载。

但更容易保持直接,就是将TestObject列表作为单个TestObject存储在其子项中的列表中 - 然后您只需要一个通用案例版本的方法。

//  Overload for single child TestObject
public TreeNodeItem RecursiveTreeBuilder(TestObject pList)
{
    TreeNodeItem node = new TreeNodeItem();
    node.Header = pList.Name;

    foreach (var child in pList.Children)
    {
        if (child != null)
        {
            node.Children.Add(RecursiveTreeBuilder(child));
        }
    }

    return node;
}

//  Your list method, with fixes
public TreeNodeItem RecursiveTreeBuilder(List<TestObject> pList, string rootHeader)
{
    if (pList == null)
        return null;

    TreeNodeItem rootNode = new TreeNodeItem();
    rootNode.Header = rootHeader;

    foreach (var obj in pList)
    {
        rootNode.Children.Add(RecursiveTreeBuilder(obj));
    }

    return rootNode;
}

另外,不要在本地变量名称上加上下划线前缀。按照惯例,下划线前缀表示标识符是属于该类的私有字段。

答案 1 :(得分:0)

我使用.LINQ库找到了更好的答案。

public ObservableCollection<TreeNodeItem> TreeNodeBuilder(List<IMetaData> pList)
    {
        if (pList == null)
            return null;

        var items = pList
            .Select(e => new TreeNodeItem()
            {
                Header = e.Name,
                Tag = e.Tag.ToString(),
                Focusable = true,
                Children = TreeNodeBuilder(e.Children)
            });

        return new ObservableCollection<TreeNodeItem>(items);
    }
相关问题