C# 递归读取所有节点和子节点
我有一个对象节点和子节点节点。 我想读取所有节点和子节点,并将它们显示在asp.net下拉列表控件中 节点的类型为: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; } } 每个节点都有许多子节点&子节点有更多的子节点,以此类推 我
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类型的