c# - Linq递归父子

标签 c# linq recursion

我有这样的数据库数据:

id | description              | parent_id
-----------------------------------------
1  | Record 1                 | null
2  | Record 2                 | 1
3  | Record 3                 | null
4  | Record 4                 | 2
5  | Record 5                 | 3

我想用Linq处理,结果应该是这样的:

Record 1
- Record 2
  - Record 4
Record 3
- Record 5

我得到了解决方案:Recursive LINQ query: select item and all children with subchildren

但不幸的是,结果只有两层,因为我想要多层> 2层的结果(就像一棵树)。

还有其他最佳解决方案吗?或者如何修改该解决方案

提前致谢

最佳答案

对于 linq-to-objects,您可以在 IEnumerable<T> 上定义自己的扩展方法递归地获取所有 child 。

public static class EnumerableExtensions
{
    public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
    {
        foreach (var parent in source)
        {
            yield return parent;

            var children = selector(parent);
            foreach (var child in SelectRecursive(children, selector))
                yield return child;
        }
    }
}

用法:

var lookup = col.ToLookup(x => x.Parent_Id);
var res = lookup[null].SelectRecursive(x => lookup[x.Id]).ToList();

关于c# - Linq递归父子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41608665/

相关文章:

javascript - 如何递归列出对象属性并将它们全部列在 'one-level-deep' 对象中?

Java - 列表的内容在递归中丢失

c# - ServiceStack OpenAPI 路由/标记说明

c# - Linq - 分组项目属于多个组?

c# - Linq 结果到 IEnumerable 无效转换

c# - 查询 Azure 表存储 - 使用静态值数组进行比较

java - 递归将 N 项乘以 2(二进制序列)

c# - 如何将列表中的字符串与句子中的单词匹配?

c# - 如何从某个网页复制所有文本并将其保存到记事本C#

c# - 如何在 Visual Studio ASP.NET Core Web 项目中每次重建时使 Kestrel 控制台窗口自动关闭/重置?