namespace Test { class Program { static void Main(string[] args) { var list = new List<Menu>() { new Menu () { Id = 1 , Name = " Main Menu 1 " , PId = 0 }, new Menu () { Id = 2 , Name = " Sub Menu 11 " , PId = 1 }, new Menu () { Id = 3 , Name = " Main Menu 2 " , PId = 0 }, new Menu () { Id = 4 , Name = " Sub Menu 21 " , PId = 3 }, new Menu () { Id = 5, Name = " Submenu 212 " , PId = 4 } }; var dictMenus = new Dictionary<int, Menu>(list.Count); foreach (var menu in list) { dictMenus.Add(menu.Id, menu); } foreach (var value in dictMenus.Values) { if (dictMenus.ContainsKey(value.PId)) { if (dictMenus[value.PId].Children == null) dictMenus[value.PId].Children = new List<Menu>(); dictMenus[value.PId].Children.Add(value); } } var result = dictMenus.Values.Where(t => t.PId == 0).ToList(); } } public class Menu { public int Id { get; set; } public string Name { get; set; } public int PId { get; set; } public List<Menu> Children { get; set; } } }