谁能告诉我如何在C#中实现一个递归的lambda表达式来遍历树结构。
发布于 2008-09-14 10:44:57
好了,我终于找到了一些空闲时间。
我们开始吧:
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);
发布于 2008-09-14 08:39:11
一个合适的解决方案,实际上是许多函数式编程语言中惯用的解决方案,应该是使用fixed-point combinator。简而言之:定点组合器回答了这样一个问题:“我如何定义一个要递归的匿名函数?”但解决方案是如此重要,以至于整篇文章都在解释它们。
一种简单、实用的替代方法是“回到过去”,在定义之前使用C:声明的滑稽动作。尝试以下操作(“factorial”函数):
Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);
就像一种护身符。
或者,对于类TreeNode
的对象的预序树遍历,它适当地实现了IEnumerable<TreeNode>
来遍历其子对象:
Action<TreeNode, Action<TreeNode>> preorderTraverse = null;
preorderTraverse = (node, action) => {
action(node);
foreach (var child in node) preorderTraverse(child, action);
};
发布于 2008-09-14 05:27:42
假设有一个虚构的对象TreeItem,它包含一个子集合来表示您的层次结构。
public void HandleTreeItems(Action<TreeItem> item, TreeItem parent)
{
if (parent.Children.Count > 0)
{
foreach (TreeItem ti in parent.Children)
{
HandleTreeItems(item, ti);
}
}
item(parent);
}
现在调用它,传入处理一项的lambda,方法是将其名称打印到控制台。
HandleTreeItems(item => { Console.WriteLine(item.Name); }, TreeItemRoot);
https://stackoverflow.com/questions/61143
复制相似问题