我有子 节点的对象节点。 我想阅读所有的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);
}
}
答案 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;
}
}
}
可能这段代码可以改进,但它确实有用,我猜......