如何使用Linq构建层次结构来对象?

我有一个数据结构列表:

public List Personals() { return new List { new Personal { Id = 0, Name = "Name 0" }, new Personal { Id = 1, Name = "Name 1", ParentId = 0 }, new Personal { Id = 2, Name = "Name 2", ParentId = 0 }, new Personal { Id = 3, Name = "Name 3", ParentId = 0 }, new Personal { Id = 4, Name = "Name 4", ParentId = 1 }, new Personal { Id = 5, Name = "Name 5", ParentId = 1 }, new Personal { Id = 6, Name = "Name 6", ParentId = 2 }, new Personal { Id = 7, Name = "Name 7", ParentId = 2 }, new Personal { Id = 8, Name = "Name 8", ParentId = 4 }, new Personal { Id = 9, Name = "Name 9", ParentId = 4 }, }; } 

我想建一棵树:

 public List Trees() { return new List { new Tree { Id = 0, Name = "Name 0", List = new List { new Tree { Id = 1, Name = "Name 1", List = new List { new Tree { Id = 4, Name = "Name 4" }, new Tree { Id = 5, Name = "Name 5" } } } } } }; } 

如何使用LinQ构建一个树来对象? 我必须使用,但它不能正常工作,见下文:

 public List GetTree(List list) { var listFormat = list.Select(x => new Tree { Id = x.Id, Name = x.Name, ParentId = x.ParentId }).ToList(); var lookup = listFormat.ToLookup(f => f.ParentId); foreach (var tree in listFormat) { tree.List = lookup[tree.Id].ToList(); } return listFormat; } 

你应该使用递归:

 public void SomeMethod() { // here you get your `list` var tree = GetTree(list, 0); } public List GetTree(List list, int parent) { return list.Where(x => x.ParentId == parent).Select(x => new Tree { Id = x.Id, Name = x.Name, List = GetTree(list, x.Id) }).ToList(); } 

与上面相同,只有此代码检查您的根节点是否具有与其自己的ID匹配的ParentID。

  public void SomeMethod() { // here you get your `list` var tree = GetTree(list, 0); } public List GetTree(List list, int parent) { return list.Where(x => x.ParentId == parent).Select(x => new Tree { Id = x.Id, Name = x.Name, List = x.ParentId != x.Id ? GetTree(list, x.Id) : new List() }).ToList(); }