Bearbeiten: Korrigiert den Code, ich habe in der Tat beide Teile des Codes kompilieren und testen, aber ich muss eingefügt haben in Versionen, bevor ich sie in VS behoben. Das tut mir leid.
Ich habe ein Subversion Repository mit dem Code, einschließlich Komponententests hinzugefügt, um sicherzustellen, dass es jetzt wie erwartet funktioniert, ist here, mit Benutzernamen und Passwort als 'Gast', ohne die Anführungszeichen einloggen.
So:
: Finden Sie zuerst
Func<TreeNode, String, TreeNode> findNode = null; // satisfy recursion re-use
findNode = (n, value) =>
{
if (n == null) return n;
if (n.Value == value) return n;
foreach (var subNode in n.Nodes)
{
TreeNode foundNode = findNode(subNode, value);
if (foundNode != null) return foundNode;
}
return null;
};
Beachten Sie, dass die hier Falle ist, dass für eine Lambda oder Delegierter rekursiv zu sein, müssen Sie die Variable deklarieren Zuerst mit einem bekannten Wert, bevor Sie ihm den tatsächlichen Delegierten zuweisen. Andernfalls wird der Compiler beschweren, dass Sie eine Variable verwenden, bevor Sie einen Wert erhalten haben.
: Hier finden Sie alle
Func<TreeNode, String, List<TreeNode>> findNodes = null;
findNodes = (n, value) =>
{
var result = new List<TreeNode>();
if (n == null) return result;
if (n.Value == value) result.Add(n);
foreach (var subNode in n.Nodes)
{
result.AddRange(findNodes(subNode, value));
}
return result;
};
Der Trick hier ist nur die Knoten auf jeder Ebene zu sammeln und aggregieren nach oben.
Fanden Sie diese kompilieren? "Delegat 'Func' nicht '1' Argumente". Ihr Aufruf zu findNodes geht nur 1 Arg! –
Ich kompilierte das erste: P –
Zuerst ändern Sie es zu: TreeNode foundNode = findNode (subNode, Wert); – ss2k