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

时间:2014-11-28 21:40:12

标签: c# recursion

我有 节点的对象节点。 我想阅读所有的Nodes&子节点并将它们显示到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);
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

可能这段代码可以改进,但它确实有用,我猜......