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

我有一个像这样的分层数据列表:
var list = new List<Data>(){some data...}

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

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

例:

numbers是Data类的number属性

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

如何通过linq查询(非递归方法或for循环)知道树的最大深度到数据列表?

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

谢谢.

解决方法

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())));
}

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...