C#迭代器遍历树形结构异常:仅能枚举根节点与直接子节点
问题描述
我正在学习C#迭代器,尝试让其在树形结构中生效,但目前仅能枚举根节点及其直接子节点。相关代码如下:
public class Node : IEnumerable<Node> { private Node Parent = null; private List<Node> Children = new List<Node>(); public string Name { get; private set; }; public Node(string name) { Name = name; } public Node AddChild(Node child) { Children.Add(child); child.Parent = this; return child; } public IEnumerator<Node> GetEnumerator() { yield return this; foreach (var x in Children) yield return x; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
我曾尝试通过静态方法实现递归遍历,但由于IEnumerator必须返回泛型类型T而无法实现。请问该方案存在什么问题?
使用示例:
Node root = new Node("html"); root.AddChild(new Node("body")).AddChild(new Node("i")).AddChild(new Node("b")); foreach(var m in root) Console.WriteLine(m.Name);
问题分析与解决方案
当前代码的核心问题
你的GetEnumerator方法只遍历了当前节点和它的直接子节点,没有递归遍历子节点的后代节点。这就导致迭代器只能处理两层结构,无法深入树形结构的更下层。
修正后的迭代器实现
只需要修改GetEnumerator方法,在遍历子节点时,嵌套枚举子节点自身的迭代器(因为Node实现了IEnumerable<Node>),就能实现深度优先遍历:
public IEnumerator<Node> GetEnumerator() { // 返回当前节点 yield return this; // 递归遍历每个子节点的所有后代 foreach (var child in Children) { foreach (var descendant in child) { yield return descendant; } } }
关于静态方法实现递归的误区
你提到的“静态方法无法实现”是错误的,完全可以通过静态方法封装递归逻辑:
private static IEnumerable<Node> Traverse(Node node) { yield return node; foreach (var child in node.Children) { foreach (var descendant in Traverse(child)) { yield return descendant; } } } public IEnumerator<Node> GetEnumerator() { return Traverse(this).GetEnumerator(); }
静态方法返回IEnumerable<Node>而非直接返回IEnumerator<Node>,之后通过调用GetEnumerator()获取枚举器即可。你之前的尝试可能是错误地让静态方法直接返回枚举器类型,或者没有正确嵌套递归的枚举逻辑。
验证效果
用你提供的示例代码测试,修正后会依次输出:
html body i b
内容的提问来源于stack exchange,提问作者marranxo
相关产品推荐
相关产品推荐

