小编典典

递归层次结构-使用Linq进行递归查询

c#

我正在使用Entity Framework(版本6)映射到递归层次结构,并且映射很好。

我的问题是我想递归地获取层次结构中特定节点的 所有 子节点。

我可以使用Linq轻松获得子节点:

var recursiveList = db.ProcessHierarchyItems
            .Where(x => x.id == id)
            .SelectMany(x => x.Children);

有人知道一个干净的实现,它将递归地得到所有孩子吗?


阅读 1055

收藏
2020-05-19

共1个答案

小编典典

尽管可以在此处使用递归方法,但是可以使用显式堆栈遍历此树结构,以避免使用堆栈空间,这对于大型树结构而言并不总是足够的。这种方法作为迭代器块也非常好,并且递归时,迭代器块比常规方法便宜得多,因此它的性能也更好:

public static IEnumerable<T> Traverse<T>(this IEnumerable<T> items, 
    Func<T, IEnumerable<T>> childSelector)
{
    var stack = new Stack<T>(items);
    while(stack.Any())
    {
        var next = stack.Pop();
        yield return next;
        foreach(var child in childSelector(next))
            stack.Push(child);
    }
}
2020-05-19