Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何循环遍历具有相同类型列表的对象列表,并将每个对象添加到TreeView?_C#_Winforms_Loops - Fatal编程技术网

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

C# 如何循环遍历具有相同类型列表的对象列表,并将每个对象添加到TreeView?,c#,winforms,loops,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) {

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

我有以下课程

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() {  }
}
等等

目前,我使用这种低效的,糟糕的,末日金字塔的方法

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层

通用解决方案

您可以创建如下所示的通用方法:

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;
}
非通用解决方案

你自己已经找到了。这非常简单明了:

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, x => x.Children, x => new TreeNode(x.Name));
treeView1.Nodes.Add(treeNode);
var treeNode = ConvertEntityToTreeNode(node);
treeView1.Nodes.Add(treeNode);

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

以防您有几个节点类和树。创建的算法总是一样的,您只需要知道:

  • 根对象
  • 如何获取对象的子对象
  • 如何使用对象创建
    TreeNode

  • 那么这个算法总是一个递归算法,你可以在泛型方法中看到。

    我自己在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;
    }
    

    您可以使用一种通用方法,它可以帮助您从
    数据表或任何
    IEnumerable
    填充
    树状视图。。。这个函数是什么?@RezaAghaei有没有一种方法可以修改这个函数以删除它,使它更自动化?请记住,我不是从数据库加载的。为什么您可能需要一个通用的解决方案?以防您有几个节点类和树。创建的算法总是一样的,您只需要知道1)根对象2)如何获取对象的子对象3)如何使用对象创建
    TreeNode
    。那么这个算法总是一个递归算法,你可以在泛型方法中看到。
    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;
    }