我的递归功能有问题。
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应该做的是返回一个节点,该节点在该节点内有一个基于原始列表的节点列表。
它只能在每个列表中保留最终节点。
帮助:)
答案 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);
}