How to build hierarchy using Linq for an object?

I have a list of data structures:

public List<Personal> Personals() { return new List<Personal> { 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 }, }; } 

and I want to build a tree:

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

How do you create a tree with LinQ for an object? I have to use, but it doesn’t work for sure, see below:

 public List<Tree> GetTree(List<Personal> 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; } 
+7
c # linq tree
source share
2 answers

You should use recursion:

 public void SomeMethod() { // here you get your `list` var tree = GetTree(list, 0); } public List<Tree> GetTree(List<Personal> 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(); } 
+15
source share

Same as above, only this code checks if your root node has a ParentID matching its own identifier.

  public void SomeMethod() { // here you get your `list` var tree = GetTree(list, 0); } public List<Tree> GetTree(List<Personal> 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<Tree>() }).ToList(); } 
0
source share

All Articles