C#中Find()方法使用问题:节点添加子节点后无输出
问题分析与解决
核心错误点
- 遍历对象错误:你在
foreach中直接遍历nodes.Find(x => x.NodeName == "A"),该方法返回的是单个Node实例,而非它的子节点集合Child,因此无法遍历出子节点,导致无输出。 AddChild方法冗余:当前方法需要传入父节点参数,但调用时已经是父节点对象(如A)发起调用,完全可以简化逻辑,避免重复传参。
修正方案
方案1:简化AddChild方法(推荐)
修改Node类的AddChild方法,直接给当前节点添加子节点:
public class Node { public string NodeName { get; set; } public LinkedList<Node> _item; public LinkedList<Node> Child { get { return _item; } set { _item = value; } } public Node() { _item = new LinkedList<Node>(); } // 简化方法,直接为当前节点添加子节点 public void AddChild(Node childNode) { this.Child.AddLast(childNode); } }
修正主方法的调用与遍历逻辑:
Node A = new Node { NodeName = "A" }; Node B = new Node { NodeName = "B" }; Node C = new Node { NodeName = "C" }; List<Node> nodes = new List<Node>(); nodes.Add(A); nodes.Add(B); nodes.Add(C); // 从列表中获取父节点和子节点 var parentNode = nodes.Find(x => x.NodeName == "A"); var childB = nodes.Find(x => x.NodeName == "B"); var childC = nodes.Find(x => x.NodeName == "C"); // 添加子节点 parentNode.AddChild(childB); parentNode.AddChild(childC); // 遍历父节点的Child集合输出子节点名称 foreach(var child in parentNode.Child) { Console.Write(child.NodeName); // 输出结果:BC }
方案2:保留原AddChild方法,仅修正遍历逻辑
如果坚持使用原双参数的AddChild方法,只需修正遍历部分,改为遍历节点的Child集合:
// 原Node类不变 A.AddChild(nodes.Find(x => x.NodeName == "A"), nodes.Find(x => x.NodeName == "B")); A.AddChild(nodes.Find(x => x.NodeName == "A"), nodes.Find(x => x.NodeName == "C")); // 修正遍历对象为Child集合 foreach(var child in nodes.Find(x => x.NodeName == "A").Child) { Console.Write(child.NodeName); // 输出结果:BC }
内容的提问来源于stack exchange,提问作者Nguyễn Nguyễn
相关产品推荐
相关产品推荐

