Desidero implementare un metodo che mi consenta di trovare un nodo in un albero. Il modo in cui lo faccio è ricorsivamente utilizzando le variabili globali per sapere quando fermarsi.Trova nodo quando si attraversa l'albero
ho la classe:
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;
}
E il metodo che ho adesso è:
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);
}
}
e il modo in cui io uso il metodo Find è come:
// 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);
Quindi la mia domanda è come posso rendere questo metodo più elegante. Mi piacerà la firma del metodo per assomigliare:
public Node FindNode(Node rootNode);
Credo che sia ridondanti cosa sto facendo e non v'è probabilmente un modo migliore di creare quel metodo. O forse potrei modificare la classe Node in modo che io possa ottenere la stessa cosa con una query linq.
+1 E 'grande causa che posso filtrare in base a qualsiasi criterio come ad esempio:. 'Root.GetSubTree() FirstOrDefault (x => x.Name == "Pippo") ; 'Grazie mille! –
Una risposta così pulita e precisa. – AndyUK