Я предполагаю, что функция на самом деле называется FindChildrenById
, в противном случае я не вижу никакой рекурсии.
В этом предположении вы можете использовать исключения (которые я настоятельно рекомендую не использовать)или верните KeyValuePair<bool, IEnumerable<Node>>
, где часть bool
будет использоваться для оповещения о начале цепочки.
Затем на уровне API предоставьте метод-обертку, который просто возвращает часть IEnumerable<Node>
и перебрасывает bool
часть.
Вот пример, приведенный для класса Node
:
public class Node
{
List<Node> children;
public string Text { get; set; }
public List<Node> Children { get { return children ?? (children = new List<Node>()); } }
}
Вы можете перемещаться и сокращаться следующим образом:
public class NodeTraverser
{
private static KeyValuePair<bool, IEnumerable<Node>> GetChildrenById(string text, Node node)
{
if(node.Text == text)
{
return new KeyValuePair<bool,IEnumerable<Node>>(true, node.Children);
}
foreach(var child in node.Children)
{
var result = GetChildrenById(text, child);
if(result.Key)
{
return result; // early out
}
}
return new KeyValuePair<bool,IEnumerable<Node>>(false, Enumerable.Empty<Node>());
}
public static IEnumerable<Node> FindChildrenbyId(string text, Node root)
{
return GetChildrenById(text, root).Value;
}
}