考虑以下C#扩展方法Traverse:
IEnumerable<T> Traverse<T>( this IEnumerable<T> source,
Func<T, IEnumerable<T>> fnRecurse );
这种方法允许我们通过T定义的树和导致T返回其子节点的任何函数来递归遍历树。
现在考虑以下T的实现:
class Node
{
public string Name;
public List<Node> Children;
}
我的目标是编写尽可能短的函数,以返回一个IEnumerable,其中包含此树中每个节点的完全限定路径。类似于:
var node = GetParentNode();
return node.Traverse( node => node.Children )
.Select( node => GetParentName(node) + ":" + node.Name );
显然,在节点中添加一个Parent属性会使问题变得微不足道。相反,我想以某种方式在函数对象内部构建我的父字符串。我认为在C++中这并不难,但我不知道如何在C#中实现。有任何想法吗?