gpt4 book ai didi

c# - 递归树创建

转载 作者:太空宇宙 更新时间:2023-11-03 16:29:16 25 4
gpt4 key购买 nike

我在 C# 中有一个 Node 类,它具有以下属性:

public class Node
{
public int Id {get;set;}
public int? ParentId {get;set;}
public string Label {get;set;}
}

我有一个 TreeView 控件,它提供了以下方法来创建一个新节点:

MyTreeView.CreateNode(key, label);
parent.Nodes.CreateNode(key, label);

如果我想添加一个新的子节点,我需要使用第二种方法,否则使用第一种方法。两者都返回 TreeNode 类型的对象。

考虑到根节点有 ParentId = null,您将如何在 C# 中创建一个递归函数来填充 TreeView ?

这是我到目前为止所做的:

// create a list of root nodes
var roots = myList.Where(x => x.ParentId == null);
// send the roots to a recursive func
foreach(var root in roots)
{
AddNode(null,root,myList);
}

这是我的递归函数:

private void AddNode(Node parent, Node current, IList<Node> items)
{
TreeNode treenode = null;
if(parent == null)
{
treenode = mytree.CreateNode(current.Id.ToString(), current.Label);
}else{
var parentnode = mytree.GetNode(parent.Id.ToString());
treenode = parentnode.Nodes.CreateNode(current.Id.ToString(), current.Label);
}
// call the recursion for the children
var children = items.Where(x => x.ParentId == current.Id);
foreach(var child in children)
{
AddNode(current, child, items);
}
}

最佳答案

如果您的 TreeView 控件是从 System.Windows.Forms.TreeView 派生的,您可以替换

MyTreeView.CreateNode(key, label);
parent.Nodes.CreateNode(key, label);

MyTreeView.Nodes.Add(key, label);
parent.Nodes.Add(key, label);

所以调用总是转到类型为 TreeNodeCollection 的 Nodes 集合。您现在可以使用 Nodes 集合作为参数,而不是您的 Node 对象。

var roots = myList.Where(x => x.ParentId == null);
foreach (var root in roots)
{
AddNode(mytree.Nodes, root, myList);
}

private void AddNode(TreeNodeCollection nodes, Node current, IList<Node> items)
{
TreeNode treenode = nodes.Add(current.Id.ToString(), current.Label);

var children = items.Where(x => x.ParentId == current.Id);
foreach (var child in children)
{
AddNode(treenode.Nodes, child, items);
}
}

这有两个好处:

  1. 您不需要每次都查找父级。
  2. 您只有一个调用 (TreeNodeCollection.Add)。

但是,如果您无法在每个根的 AddNode 调用中访问 TreeView.Nodes 集合,则必须在 AddNode 方法的顶部进行检查。

var roots = myList.Where(x => x.ParentId == null);
foreach (var root in roots)
{
AddNode(null, root, myList);
}

private void AddNode(TreeNodeCollection nodes, Node current, IList<Node> items)
{
if (nodes == null)
{
nodes = myTree.Nodes;
}

...
}

关于c# - 递归树创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11364719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com