Quiero implementar un método que me permita encontrar un nodo en un árbol. La forma en que lo hago es recursivamente usando variables globales para saber cuándo parar.Buscar nodo cuando se cruza el árbol
tengo la clase:
class Node // represents a node in the tree
{
// constructor
public Node() {
Children = new List<Node>();
}
public List<Node> Children;
public string Name;
public string Content;
}
Y el método que tengo ahora es:
private bool IsNodeFound = false; // global variable that I use to decide when to stop
// method to find a particular node in the tree
private void Find(Node node, string stringToFind, Action<Node> foundNode)
{
if(IsNodeFound)
return;
if (node.Content.Contains(stringToFind)){
foundNode(node);
IsNodeFound =true;
}
foreach (var child in node.Children)
{
if (child.Content.Contains(stringToFind)){
foundNode(node);
IsNodeFound =true;
}
Find(child, stringToFind, foundNode);
}
}
y la forma en que uso el método Find es como:
// root is a node that contain children and those children also contain children
// root is the "root" of the tree
IsNodeFound =false;
Node nodeToFind = null;
Find(root, "some string to look for", (x)=> nodeToFind=x);
Así que mi pregunta es cómo puedo hacer que este método sea más elegante. Me gustaría la firma del método para que parezca:
public Node FindNode(Node rootNode);
Creo que es redundante a lo que estoy haciendo y es probable que haya una mejor manera de crear ese método. O quizás podría alterar la clase Node para que pueda lograr lo mismo con una consulta linq.
+1 Es genial porque puedo filtrar en función de los criterios tales como:. 'Root.GetSubTree() FirstOrDefault (x => x.Name == "foo") ; '¡Muchas gracias! –
Una respuesta tan clara y precisa. – AndyUK