【问题标题】:Read all nodes and child nodes recursively递归读取所有节点和子节点
【发布时间】:2014-11-28 21:40:11
【问题描述】:

我有一个带有 child Nodes 的对象 Node。 我想读取所有节点和子节点并将它们显示到 asp.net 下拉列表控件中。

节点的类型为:

Microsoft.TeamFoundataion.WorkItemTracking.Client.Node

类节点如下所示:

public class Node
{
    public string Name { get; set; }
    public string Path { get; set; }
}

每个节点有很多子节点&子节点有更多子节点等等......

我编写了代码来获取节点和第一级子节点。 我想不出我如何递归读取所有节点??

Dictionary<string,string> ParentN = new Dictionary<string,string>();
Dictionary<string, string> childN = new Dictionary<string, string>();
foreach (Node area in Proj.Nodes)
{
    ParentN.Add(area.Name, area.Path);
    Console.WriteLine(area.Path);

    foreach (Node item in area.ChildNodes)
    {
        childN.Add(item.Name, item.Path);
        Console.WriteLine(item.Path);
    }
}

【问题讨论】:

    标签: c# recursion


    【解决方案1】:

    为此,您需要一个递归函数。孩子也可以做父母。如果一个孩子下面没有孩子,那么我们不会将它添加到父母的字典中。

    void GetNode(Node parent)
    {
        if (parent.ChildNodes.Any())
        {
            ParentN.Add(parent.Name, parent.Path);
            foreach(child in parent.ChildNodes)
            {
                childN.Add(child.Name, child.Path);
                GetNode(child);
            }
        }
        Console.WriteLine(parent.Name);
    }
    

    【讨论】:

    • 我不能在 parent.ChildNodes.Any() 中使用 .Any()。它给我一个错误,说 NodeCollection 不包含 Any 的定义
    • @PowerCoder 好吧,我不知道你的Proj.Nodes是什么类型,只是检查是否有孩子。
    • 任何你需要的using System.Linq;
    • @PowerCoder 您的 ChildNodes 集合是什么类型的?
    • 它的类型是 Microsoft.TeamFoundataion.WorkItemTracking.Client.Node
    【解决方案2】:

    您发布的类节点不包含子节点。我假设你的意思是:

    public class Node
    {
        public string Name { get; set; }
        public string Path {get; set;}
        IList<Node> ChildNodes { get; set; }
    }
    

    你可以这样做:

    static class NodeExtensions
    {
        public static IEnumerable<Node> ReadChildNodes(this Node node)
        {
            foreach(Node childNode in node.ChildNodes){
                if(childNode.ChildNodes != null && childNode.ChildNodes.Any()){
                    foreach(Node grandChildren in childNode.ReadChildNodes())
                        yield return grandChildren;
                }
    
                yield return childNode;
            }
        }
    }
    

    可能这段代码可以改进,但我猜它可以工作......

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多