c# - 递归层次父子

标签 c# .net algorithm linq

我有一个来自数据库的项目集合,该数据库具有 parentid 值或 null。

这是我的类(class)设计:

public class Item
{
public int id{get;set;}
public string Name{get;set;}
public int? ParentId{get;set;}
public List<Item> SubItems{get;set;}
}

我想从集合中构建项目的层次结构。假设一个集合有 100 个项目,我需要从中构建基于 ParentId 映射的结构。

我试过这篇文章 Recursive Hierarchical Joins in C# and LINQ 但如果 ParentId 为空,它会给我一个错误。

也试过Build tree type list by recursively checking parent-child relationship C# ,但此解决方案也不适合我。

我如何实现这一目标?

最佳答案

您可以使用这种方法:

  1. 从数据库中获取所有项目(不填充子项目)。
  2. 构建 Lookup<int?,Item>父 ID 和具有该父 ID 的项目。
  3. 遍历项目并使用查找将每个项目与子项目相关联。

代码:

var items = // get from the database... (e.g. as a list)
var lookup = items.ToLookup(x => x.ParentId);
foreach (var item in items)
    item.SubItems = lookup[item.Id].ToList();

正如 @EamonNerbonne 在下面评论的那样,如果需要,您也可以获得根元素:

var roots = lookup[null].ToList();

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

相关文章:

algorithm - 从复杂性类别计算时间

sql - 有效地找到 "record high"值

c# - 如何等待 NamedPipeServer 的响应?

c# - 为什么在调用 ServiceHost.Open 之前实例化 XmlSerializer 会产生内存和句柄泄漏

c# - 在存储到 Redis 之前是否使用 protobuf-net 序列化原语

c# - Linq 投影在 NHibernate 3.2 中被错误缓存

c# - .net推荐的好的动态编程语言

c# - Entity Framework 无法识别的唯一键

c# - 使用 Entity Framework T4 POCO

c++ - 时间戳组织的容器