gpt4 book ai didi

linq - 使用 LINQ 呈现层次结构?

转载 作者:行者123 更新时间:2023-12-04 17:41:05 26 4
gpt4 key购买 nike

假设我们有一个类

Category
{
ID,
Name,
ParentID
}

和一个列表
1, 'Item 1', 0
2, 'Item 2', 0
3, 'Item 3', 0
4, 'Item 1.1', 1
5, 'Item 3.1', 3
6, 'Item 1.1.1', 4
7, 'Item 2.1', 2

我们可以使用 LINQ 来渲染一棵树,例如:
Item 1
Item 1.1
Item 1.1.1
Item 2
Item 2.1
Item 3
Item 3.1

任何帮助表示赞赏!

最佳答案

这是“仅限 LINQ”的版本:

Func<int, int, string[]> build = null;
build = (p, n) =>
{
return (from x in categories
where x.ParentID == p
from y in new[]
{
"".PadLeft(n)+ x.Name
}.Union(build(x.ID, n + 1))
select y).ToArray();
};
var lines = build(0, 0);

是的,它是递归的 LINQ。

NVA的请求,这里是使所有“孤儿”记录成为根记录的方法:
Func<IEnumerable<int>, int, string[]> build = null;
build = (ps, n) =>
{
return (from x in categories
where ps.Contains(x.ParentID)
from y in new[]
{
"".PadLeft(n)+ x.Name
}.Union(build(new [] { x.ID }, n + 1))
select y).ToArray();
};

var roots = (from c in categories
join p in categories on c.ParentID equals p.ID into gps
where !gps.Any()
orderby c.ParentID
select c.ParentID).Distinct();

var lines = build(roots, 0);

关于linq - 使用 LINQ 呈现层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com