J'ai la méthode suivante qui fonctionne bien, sauf que l'instruction de rupture de rendement ne sort que de l'énumérateur actuel. Je comprends pourquoi c'est le cas, mais je dessine un blanc sur la façon de propager la rupture de rendement à travers la pile récursive.Comment puis-je sortir des boucles IEnumerable IEnumerable <T> en utilisant la rupture de rendement?
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;
}
}
Alors, quand j'ai les nœuds suivants et passe "Top 2 a" comme 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
... puis-je obtenir le résultat:
Top 2 aa
Top 2 ab
Top 2 ac
C'est le résultat correct, cependant, lorsque je parcours mon code, la boucle la plus extérieure continue à traiter les 3 premiers et 4 premiers. Comment puis-je sortir de cette boucle externe?
Merci @Rune FS. Je vais essayer cela et rendre compte. –