Chcę zaimplementować metodę, która pozwoli mi znaleźć węzeł w drzewie. Sposób, w jaki to robię, rekursywnie używa zmiennych globalnych, aby wiedzieć, kiedy przestać.Znajdź węzeł podczas przemieszczania drzewa
mam klasę:
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;
}
a sposób mam teraz jest:
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);
}
}
i sposób używam metoda Find jest jak:
// 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);
Moje pytanie brzmi:, jak mogę uczynić tę metodę bardziej elegancką. będzie tak jak podpis metody wyglądać:
public Node FindNode(Node rootNode);
myślę, że jest redundantny co robię i nie ma chyba lepszego sposobu tworzenia tej metody. A może mógłbym zmienić klasę węzła, aby osiągnąć to samo z zapytaniem linq.
+1 To jest wielki powód mogę filtrować na podstawie dowolnych kryteriów, takich jak:. 'Root.GetSubTree() FirstOrDefault (x => x.Name == "Foo") ; 'Wielkie dzięki! –
Tak czysta, precyzyjna odpowiedź. – AndyUK