You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33