我有下面这个方法,它很好用,但是yield break语句只能跳出当前的枚举器。我知道为什么会这样,但是我不知道如何将yield break传递到递归堆栈中。
private static IEnumerable<Node> FindChildrenById(IEnumerable nodes, string parentText) {
var en = nodes.GetEnumerator();
var targetFound = false;
while (en.MoveNext()) {
var node = en.Current as Node;
if (node != null)
{
if (node.Parent == null && string.IsNullOrEmpty(parentText))
{
//Returns the top level nodes if an empty parentIdis entered
targetFound = true;
yield return node;
}
else if (node.Parent != null && node.Parent.Text == parentText)
{
//returns the nodes belonging to the parent
yield return node;
}
else
{
//Recurse into the children to see whether one of these is the node to find
foreach (var nd in FindChildrenById(node.Nodes, parentText))
{
yield return nd;
}
}
}
}
if (targetFound)
{
yield break;
}
}
当我有以下节点并将“Top 2 a”作为parentText传递时...
Top 1
Top 1 a
Top 1 b
Top 2
Top 2 a
Top 2 aa
Top 2 ab
Top 2 ac
Top 2 b
Top 3
Top 3 a
Top 3 b
Top 4
...然后我得到了结果:
Top 2 aa
Top 2 ab
Top 2 ac
这是正确的结果,但当我逐步执行代码时,最外层循环继续处理 Top 3 和 Top 4。如何跳出这个外部循环?