c# - 嵌套产量在树中的表现

标签 c# performance ienumerable yield

我有一个树状结构。此结构中的每个元素都应该能够返回它作为根的所有元素的 Enumerable。我们称这个方法为IEnumerable<Foo> GetAll() .所以如果我们有

     A  <-- topmost root
    / \ 
   /   \
  B     C
 / \   / \
D   E F   G

调用GetAll在元素上 C返回 {C, F, G} (元素的固定顺序会很好,但不是必需的)。我想每个人都已经知道了。

当前执行 GetAll看起来像这样:

public IEnumerable<Foo> GetAll ()
{
    yield return this;

    foreach (Foo foo in MyChildren) {
        foreach (Foo f in foo.GetAll ()) {
            yield return f;
        }
    }
}

在早期的实现中,我返回了一个 List 并使用 List.AddRange() 添加了 child-foos .

我的问题是使用 yield 的版本是否正确实现或者是否应该改进(尤其是在性能方面)。或者这只是不好,我应该坚持 List s(或 ReadOnlyCollections)代替?

最佳答案

如果将递归展开到堆栈,您可以提高性能,因此您将只有一个迭代器:

public IEnumerable<Foo> GetAll()
{
    Stack<Foo> FooStack = new Stack<Foo>();
    FooStack.Push(this);

    while (FooStack.Count > 0)
    {
        Foo Result = FooStack.Pop();
        yield return Result;
        foreach (Foo NextFoo in Result.MyChildren)
            FooStack.Push(NextFoo);
    }
}

关于c# - 嵌套产量在树中的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043050/

相关文章:

c# - C# 编译器是否计算常数的数学?

c# - 在 ASP.NET MVC View 中转换 IEnumerable(到数组、列表)

c# - ASP.Net Core MVC - 自定义属性的客户端验证

c# - 每 24 小时触发一次计时器回调 - DST 是否正确处理?

c# - C# 和 Winforms 中正确的类实例化

c# - 找出文本框文本是否在 mvvm 模式中没有改变一秒钟

performance - Lithium 中的 MongoDB 查询 - 我应该使用 `order` 还是 `$orderby` ,还是不重要?

php - 加速 MySQL 查询,尝试了普通查询和连接 - 速度相同

c# - 将 LinqToSql 表绑定(bind)到 Repeater

c# - 是否可以在不破坏二进制兼容性的情况下升级到 Generic IEnumerable