[英]Get all Child of Node
我在下面有一个Node
class:
public class Node {
public int begin {get;set;}
public int end {get;set;}
}
然后我创建一个包含父母和孩子的列表,如下所示:
List<Node> list = new List<Node>();
list.Add(new Node(){begin = 1, end =2});
list.Add(new Node(){begin = 1, end =3});
list.Add(new Node(){begin = 2, end =4});
list.Add(new Node(){begin = 2, end =5});
list.Add(new Node(){begin = 5, end =6});
list.Add(new Node(){begin = 5, end =7});
这是上面列表的树数据:
1
2 3
4 5
6 7
如何找到节点的所有父节点? 例如,如果我的Node
是2
。 结果是: 4,5,6,7
我尝试了这段代码,但当我的Node
为2
时4, 5
public static List<int> FindChild(List<Node> list,int id) {
int value = id;
List<int> res = new List<int>();
var child = list.Where(b => b.begin == id).ToList();
foreach (var item in child) {
res.Add(item.end);
FindChild(list,item.end);
}
return res;
}
正如 canton7 在评论中提到的,您正在使用边而不是节点。
除此之外,您当前没有将递归FindChild
调用中的每个项目添加到res
。
与其使用列表,不如使用IEnumerable
更有效/更灵活:
public static IEnumerable<int> FindDescendants(IEnumerable<Edge> edges, int id)
{
var children = edges.Where(b => b.begin == id);
foreach (var child in children)
{
yield return child.end;
foreach (var descendant in FindDescendants(edges, child.end))
{
yield return descendant.end;
}
}
}
如果需要列表,可以使用 LINQ:
List<int> descendants = FindDescendants(list, 2).ToList();
你真的很亲近!
您正确地找到了所有以2
为父级的边,并且您正确地递归地遍历了2
的所有子级以找到他们的子级。 唯一的问题是您正在丢弃这些信息!
public static List<int> FindChild(List<Node> list,int id) {
int value = id;
List<int> res = new List<int>();
var child = list.Where(b => b.begin == id).ToList();
foreach (var item in child) {
res.Add(item.end);
FindChild(list,item.end); // <-- You threw away the return value!
}
return res;
}
最简单的解决方案是将FindChild
的返回值添加到res
:
res.AddRange(FindChild(list,item.end));
这行得通。
您可以稍微提高效率,并避免创建大量新列表并复制其内容:
public static List<int> FindChild(List<Node> input, int id)
{
var result = new List<int>();
FindChild(input, id, result);
return result;
}
public static void FindChild(List<Node> input, int id, List<int> result) {
int value = id;
var child = input.Where(b => b.begin == id).ToList();
foreach (var item in child) {
result.Add(item.end);
FindChild(input, item.end, result);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.