C# 如何获取父节点的所有子节点?
我的DTO如下所示:C# 如何获取父节点的所有子节点?,c#,recursion,C#,Recursion,我的DTO如下所示: class TreeLevel { public long Id { get; set; } public long? ParentId { get; set; } } 我有一个简单的DTO列表: var list = new List<TreeLevel>() { new TreeLevel { Id=1, ParentId=null
class TreeLevel
{
public long Id { get; set; }
public long? ParentId { get; set; }
}
我有一个简单的DTO列表:
var list = new List<TreeLevel>() {
new TreeLevel {
Id=1,
ParentId=null
},
new TreeLevel{
Id=2,
ParentId=1
},
new TreeLevel{
Id=3,
ParentId=1
},
new TreeLevel{
Id=4,
ParentId=2
},
new TreeLevel{
Id=5,
ParentId=8
},
new TreeLevel{
Id=6,
ParentId=null
},
new TreeLevel{
Id=7,
ParentId=null
},
new TreeLevel{
Id=8,
ParentId=4
},
new TreeLevel{
Id=9,
ParentId=10
},
new TreeLevel{
Id=10,
ParentId=8
}
};
我怎样才能做到这一点?谢谢如果找到优化的方法,将更新答案,现在就完成它的工作
var allNodes = new List<TreeLevel>();
var parentNodes = list.Where(x => x.Id == 8).ToList();
do
{
foreach (var item in parentNodes)
{
list.Remove(item); // to avoid loops in graph
}
var childNodes = new List<TreeLevel>();
foreach (var parentId in parentNodes.Select(x => x.Id).Distinct())
{
childNodes.AddRange(list.Where(x => x.ParentId == parentId));
}
allNodes.AddRange(childNodes);
parentNodes = childNodes;
} while (parentNodes.Any());
var allNodes=new List();
var parentNodes=list.Where(x=>x.Id==8.ToList();
做
{
foreach(父节点中的变量项)
{
list.Remove(item);//避免图形中的循环
}
var childNodes=新列表();
foreach(parentNodes.Select(x=>x.Id).Distinct()中的var parentId)
{
AddRange(list.Where(x=>x.ParentId==ParentId));
}
AddRange(childNodes);
parentNodes=childNodes;
}while(parentNodes.Any());
将更新答案,如果找到优化它的方法,现在就完成它的工作
var allNodes = new List<TreeLevel>();
var parentNodes = list.Where(x => x.Id == 8).ToList();
do
{
foreach (var item in parentNodes)
{
list.Remove(item); // to avoid loops in graph
}
var childNodes = new List<TreeLevel>();
foreach (var parentId in parentNodes.Select(x => x.Id).Distinct())
{
childNodes.AddRange(list.Where(x => x.ParentId == parentId));
}
allNodes.AddRange(childNodes);
parentNodes = childNodes;
} while (parentNodes.Any());
var allNodes=new List();
var parentNodes=list.Where(x=>x.Id==8.ToList();
做
{
foreach(父节点中的变量项)
{
list.Remove(item);//避免图形中的循环
}
var childNodes=新列表();
foreach(parentNodes.Select(x=>x.Id).Distinct()中的var parentId)
{
AddRange(list.Where(x=>x.ParentId==ParentId));
}
AddRange(childNodes);
parentNodes=childNodes;
}while(parentNodes.Any());
我在下面编写了TraverseTree例程,该例程递归遍历树并将结果作为IEnumerable返回
我在下面编写了TraverseTree例程,该例程递归遍历树并将结果作为IEnumerable返回
你试过什么了吗?你到底被困在哪里?结果可能是5,10,9?@LasseV.Karlsen是的,因为5的父母是8,10的父母是8,9的父母是10。10的父母是8岁。所以所有的孩子都必须是5,9,10岁你试过什么了吗?你到底被困在哪里?结果可能是5,10,9?@LasseV.Karlsen是的,因为5的父母是8,10的父母是8,9的父母是10。10的父母是8岁。因此,所有儿童必须是5,9,10岁
using System;
using System.Collections.Generic;
using System.Linq;
namespace GetAllChildren
{
class Program
{
static void Main(string[] args)
{
var list = new List<TreeLevel>()
{
new TreeLevel { Id=1, ParentId=null },
new TreeLevel{ Id=2, ParentId=1 },
new TreeLevel{ Id=3, ParentId=1 },
new TreeLevel{ Id=4, ParentId=2 },
new TreeLevel{ Id=5, ParentId=8 },
new TreeLevel{ Id=6, ParentId=null },
new TreeLevel{ Id=7, ParentId=null },
new TreeLevel{ Id=8, ParentId=4 },
new TreeLevel{ Id=9, ParentId=10 },
new TreeLevel{ Id=10, ParentId=8 }
};
var result = TraverseTree(list, 8).ToList();
for (int i = 0; i < result.Count(); i++)
{
Console.WriteLine($"{result[i].Id} - {result[i].ParentId}");
}
Console.ReadKey();
}
private static IEnumerable<TreeLevel> TraverseTree(List<TreeLevel> list, long id)
{
return list
.Where(child => child.ParentId == id)
.Union(list.Where(child => child.ParentId == id)
.SelectMany(parent => TraverseTree(list, parent.Id))
);
}
}
class TreeLevel
{
public long Id { get; set; }
public long? ParentId { get; set; }
}
}
5 - 8
10 - 8
9 - 10