Rekursive Lambda-Ausdruck einen Baum in C # zu durchqueren
Frage
Kann mir jemand zeigen, wie eine rekursive Lambda-Ausdruck implementieren eine Baumstruktur in C # zu durchqueren.
Lösung
Ok, fand ich etwas freie Zeit endlich.
Los geht's:
class TreeNode
{
public string Value { get; set;}
public List<TreeNode> Nodes { get; set;}
public TreeNode()
{
Nodes = new List<TreeNode>();
}
}
Action<TreeNode> traverse = null;
traverse = (n) => { Console.WriteLine(n.Value); n.Nodes.ForEach(traverse);};
var root = new TreeNode { Value = "Root" };
root.Nodes.Add(new TreeNode { Value = "ChildA"} );
root.Nodes[0].Nodes.Add(new TreeNode { Value = "ChildA1" });
root.Nodes[0].Nodes.Add(new TreeNode { Value = "ChildA2" });
root.Nodes.Add(new TreeNode { Value = "ChildB"} );
root.Nodes[1].Nodes.Add(new TreeNode { Value = "ChildB1" });
root.Nodes[1].Nodes.Add(new TreeNode { Value = "ChildB2" });
traverse(root);
Andere Tipps
Eine richtige Lösung, und in der Tat die idiomatische Lösung in vielen funktionalen Programmiersprachen, wäre die Verwendung eines
Eine einfache Alternative zu den Eskapaden von C und C ++ „in der Zeit zurück gehen“: Erklärung vor Definition. Versuchen Sie wie folgt vor: Funktioniert wie ein Zauber. Ja, die Arbeit, mit einer kleinen Einschränkung tut. C # hat wandelbar Referenzen. So stellen Sie sicher, dass Sie nicht versehentlich etwas tun, wie folgt aus: Natürlich ist dieses Beispiel ein wenig gekünstelt, aber das könnte passieren, wenn wandelbar Referenzen verwenden. Wenn Sie die combinators benutzen aku ‘ s-Verbindungen, wird dies nicht möglich sein.
Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);
Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);
// Make a new reference to the factorial function
Func<int, int> myFact = fact;
// Use the new reference to calculate the factorial of 4
myFact(4); // returns 24
// Modify the old reference
fact = x => x;
// Again, use the new reference to calculate
myFact(4); // returns 12
Unter der Annahme ein mythisches Objekt TreeItem, die eine Kind Sammlung conatins Hierarchie darzustellen.
public void HandleTreeItems(Action<TreeItem> item, TreeItem parent)
{
if (parent.Children.Count > 0)
{
foreach (TreeItem ti in parent.Children)
{
HandleTreeItems(item, ti);
}
}
item(parent);
}
Jetzt ist es zu nennen, in dem Lambda vorbei, die ein Element behandelt, durch Druck seinen Namen an die Konsole.
HandleTreeItems(item => { Console.WriteLine(item.Name); }, TreeItemRoot);