标题可能不是很清楚,但是我会在这里尝试解释更多...
我有以下课程...
public class Node
{
public string Name { get; set; } = string.Empty;
public List<Node> Children { get; set; } = new List<Node>();
public Node(string name, List<Node> children)
{
Name = name;
Children = children;
}
public Node() { }
}
我有一个 TreeView ,该元素应该是这样的...
- Root
- Node 0_0
- Node 1_0
- Node 2_0
- Node 1_1
- Node 0_1
- Node 1_0
- Node 1_1
依此类推...
目前,我使用的是效率低下,糟糕的,金字塔形的方法...
var rootNode = GetNodeFromString();
var rootTreeNode = TreeView1.Items.Add(new TreeNode(rootNode.Name));
foreach (var child0 in rootNode.Children)
{
var node1 = rootTreeNode.Items.Add(new TreeNode(child0.Name));
foreach (var child1 in node1.Children)
{
node1.Items.Add(new TreeNode(child1.Name));
// Repeat the code 30 more times...
}
}
还有其他方法可以实现无限深度吗? ( 并非无限,例如128层 )
答案 0 :(得分:1)
通用解决方案
您可以创建这样的通用方法:
private TreeNode ConvertEntityToTreeNode<T>(
T entity,
Func<T, IEnumerable<T>> getChilds,
Func<T, TreeNode> createTreeNode)
{
TreeNode node = createTreeNode(entity);
var childs = getChilds(entity);
foreach (T child in childs)
node.Nodes.Add(ConvertEntityToTreeNode(child, getChilds, createTreeNode));
return node;
}
entity
:将在树层次结构中成为根的实体。getChilds
:用于从节点获取子代的表达式。createTreeNode
:从实体创建TreeNode
的表达式。然后以这种方式使用它:
var treeNode = ConvertEntityToTreeNode(node, x => x.Children, x => new TreeNode(x.Name));
treeView1.Nodes.Add(treeNode);
非常规解决方案
您已经自己找到了。这非常简单明了:
private TreeNode ConvertEntityToTreeNode(Node entity)
{
var node = new TreeNode(entity.Name);
foreach (var child in entity.Children)
node.Nodes.Add(ConvertEntityToTreeNode(child));
return node;
}
然后以这种方式使用它:
var treeNode = ConvertEntityToTreeNode(node);
treeView1.Nodes.Add(treeNode);
为什么需要通用解决方案?
以防万一,您有几个节点类和树。创建的算法始终相同,您只需要知道:
TreeNode
然后,该算法始终是您在通用方法中看到的递归算法。
答案 1 :(得分:1)
我已经找到了一种方法来自己完成 11行 ...
public static TreeNode ToTreeNode(Node root)
{
var treeNode = new TreeNode(root.Name);
foreach (var node in root.Children)
{
treeNode.Nodes.Add(ToTreeNode(node));
}
return treeNode;
}