如何遍历具有相同类型列表的对象列表,并将每个对象添加到TreeView?

时间:2019-02-17 18:17:50

标签: c# winforms loops

标题可能不是很清楚,但是我会在这里尝试解释更多...

我有以下课程...

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层

2 个答案:

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

为什么需要通用解决方案?

以防万一,您有几个节点类和树。创建的算法始终相同,您只需要知道:

  1. 根对象
  2. 如何获取对象的子对象
  3. 如何使用对象创建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;
}