C# 递归读取所有节点和子节点

C# 递归读取所有节点和子节点,c#,recursion,C#,Recursion,我有一个对象节点和子节点节点。 我想读取所有节点和子节点,并将它们显示在asp.net下拉列表控件中 节点的类型为: Microsoft.TeamFoundataion.WorkItemTracking.Client.Node 类节点如下所示: public class Node { public string Name { get; set; } public string Path { get; set; } } 每个节点都有许多子节点&子节点有更多的子节点,以此类推 我

我有一个对象节点子节点节点。 我想读取所有节点和子节点,并将它们显示在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);
    }
}
Dictionary ParentN=new Dictionary();
Dictionary childN=新字典();
foreach(项目节点中的节点区域)
{
ParentN.Add(area.Name,area.Path);
控制台写入线(区域路径);
foreach(区域.ChildNodes中的节点项)
{
添加(item.Name,item.Path);
Console.WriteLine(item.Path);
}
}

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

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);
}

你需要一个递归函数。孩子也可以是父母。如果一个孩子下面没有孩子,那么我们不会把它添加到父母的口述中

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);
}

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

public class Node
{
    public string Name { get; set; }
    public string Path {get; set;}
    IList<Node> ChildNodes { get; set; }
}
公共类节点
{
公共字符串名称{get;set;}
公共字符串路径{get;set;}
IList子节点{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;
        }
    }
}
静态类节点扩展
{
公共静态IEnumerable ReadChildNodes(此节点)
{
foreach(Node.ChildNodes中的Node-childNode){
if(childNode.ChildNodes!=null&&childNode.ChildNodes.Any()){
foreach(childNode.ReadChildNodes()中的节点子节点)
回报子孙;
}
收益返回子节点;
}
}
}

也许这段代码可以改进,但我想它是有效的…

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

public class Node
{
    public string Name { get; set; }
    public string Path {get; set;}
    IList<Node> ChildNodes { get; set; }
}
公共类节点
{
公共字符串名称{get;set;}
公共字符串路径{get;set;}
IList子节点{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;
        }
    }
}
静态类节点扩展
{
公共静态IEnumerable ReadChildNodes(此节点)
{
foreach(Node.ChildNodes中的Node-childNode){
if(childNode.ChildNodes!=null&&childNode.ChildNodes.Any()){
foreach(childNode.ReadChildNodes()中的节点子节点)
回报子孙;
}
收益返回子节点;
}
}
}

也许这段代码可以改进,但它可以工作,我想…

我不能在parent.ChildNodes.Any()中使用.Any()。。它给我一个错误,说NodeCollection不包含Any@PowerCoder嗯,我不知道您的
项目节点是什么类型的,只是检查是否有子节点。对于任何子节点,您都需要使用System.Linq
@PowerCoder您的ChildNodes集合是什么类型的?它是Microsoft.TeamFoundation.WorkItemTracking.Client.Nodei无法使用parent.ChildNodes.Any()中的.Any()。。它给我一个错误,说NodeCollection不包含Any@PowerCoder嗯,我不知道您的
项目节点是什么类型的,只是检查是否有子节点。对于任何子节点,您都需要使用System.Linq
@PowerCoder您的ChildNodes集合是什么类型的?它是Microsoft.TeamFoundation.WorkItemTracking.Client.Node类型的