c# - 如何使用 linq 查询获取层次数据的深度?

标签 c# linq

我有一个这样的分层数据列表:

var list = new List<Data>(){some data...}

class Data
{
    public int number;
    public List<Data> info;
}

注意:树叶中的数据 -->info = null

示例:

数字是数据类的数字属性

   --1
      --11
   --2
      --21
      --22
      --23
      --24
   --3
      --31
      --32
          --321
          --322
   --4
      --41
      --42

如何使用 linq 查询(不是递归方法或 for 循环)到数据列表来知道树的最大深度?

在此示例中,最大级别为 3,表示 321,322

谢谢。

最佳答案

LINQ 和 SQL 在平面数据结构上运行;它们不是为递归数据结构设计的。

使用 LINQ to Entities,我相信您运气不好。在每个节点中存储子树的深度,并在您插入/删除节点时递归更新它。

使用 LINQ to Objects,您可以定义一个递归扩展方法,该方法返回树中的所有路径并采用最长路径的长度:

var result = root.Paths().Max(path => path.Length);

在哪里

public static IEnumerable<Data[]> Paths(this Data data)
{
    return Paths(data, new[] { data });
}

private static IEnumerable<Data[]> Paths(Data data, Data[] path)
{
    return new[] { path }.Concat((data.info ?? Enumerable.Empty<Data>())
    .SelectMany(child => Paths(child, path.Concat(new[] { child }).ToArray())));
}

关于c# - 如何使用 linq 查询获取层次数据的深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10570625/

相关文章:

c# - 在 NetStandard 2.0 类库中使用 Newtonsoft 库

sql - LINQ 到 SQL : subfilter in where conditions

c# - Entity Framework 4 中的简单条件 LINQ 查询

c# - 无法使用 linq 更新

c# - 使用 OwnsOne() 时,“FromSqlRaw 或 FromSqlInterpolated 是使用不可组合的 SQL 调用的,并在其上组合了一个查询”

c# - 使 Wcf 服务集成 WindowsAuthentication

c# - FontButton 字体更改不起作用

c# - 使用 LINQ 进行两个查询的完全外部联接的更好方法? C#

c# - 如何查找列表的元素是否在另一个列表中?

c# - 在 Unity 中创建浮力船