【发布时间】:2011-05-11 06:23:21
【问题描述】:
是否可以在实现System.Collections.IEnumerable 的迭代器中使用递归?我有一个大致如下声明的树结构:
public class Node
{
public Node Sibling;
public Node Child;
}
我想遍历树中的节点。我想做这样的事情(伪代码,我猜这不会编译):
public class NodeIterator : System.Collections.IEnumerable
{
Node m_root;
public System.Collections.IEnumerator GetEnumerator()
{
recursiveYield(m_root);
}
System.Collections.IEnumeraton recursiveYield(Node node)
{
yield return node;
if (node.Child)
{
recursiveYield(node.Child);
}
if (node.Sibling)
{
recursiveYield(node.Sibling);
}
}
}
这有可能吗?我意识到这可以在GetEnumerator 函数中使用Node deque 来解决,而无需递归。
【问题讨论】:
-
应该可以。你试过了吗?客户不应该关心它是如何实现的——它只需要能够遍历接收器。如果递归使您的代码更简单,请使用它。
-
@Gishu - 应该可以工作(除了
IEnumeraton),但它忽略了recursiveYield(node.Child)和recursiveYield(node.Sibling)的返回值。 -
不完全是重复的,但C# Performance of nested yield in a tree 展示了一些解决方案并讨论了一些性能影响。