using System.Collections.Generic;
public int Id {get; set;}
public int? ParentId {get; set;}
public int Id {get; set;}
public List<Item> Items {get; set;}
public Item(HItem item, Dictionary<int,List<HItem>> dict){
if(dict.TryGetValue(item.Id, out var children))
Items = children.Select(x => new Item(x, dict)).ToList();
public static void Main()
var hItem1 = new HItem { Id = 1 };
var hItem2 = new HItem { Id = 2, ParentId = 1 };
var hItem3 = new HItem { Id = 3, ParentId = 1 };
var hItem4 = new HItem { Id = 4, ParentId = 2 };
var hItem5 = new HItem { Id = 5, ParentId = 4 };
var hItem6 = new HItem { Id = 5 };
var hItems = new List<HItem> { hItem1, hItem2, hItem3, hItem4, hItem5, hItem6 };
var dhItems = hItems.GroupBy(x=>x.ParentId).ToDictionary(x => x.Key??0, x => x.ToList());
foreach(var key in dhItems.Keys) Console.WriteLine(string.Format("Key {0}, Count {1}",key, dhItems[key].Count()));
var rootHItems = dhItems[0];
var items = rootHItems.Select(x => new Item(x, dhItems)).ToList();