using System.Collections.Generic;
private static readonly IList<Menu> MenuItems = new List<Menu>
new Menu(1, -1, "Menu1"),
new Menu(2, -1, "Menu2"),
new Menu(3, -1, "Menu3"),
public Menu(int id, int parentId, string name)
public int ParentId { get; }
public string Name { get; }
public static void Main()
Console.WriteLine("Printed menu:");
private static void PrintMenu(IEnumerable<Menu> menuItems)
var menus = menuItems.ToList();
var mapping = new Dictionary<int, List<Menu>>();
foreach (var menu in menuItems)
if (!mapping.ContainsKey(menu.ParentId))
mapping.Add(menu.ParentId, new List<Menu>());
mapping[menu.ParentId].Add(menu);
PrintDict(mapping, mapping[-1], new StringBuilder());
private static void PrintDict(Dictionary<int, List<Menu>> mapping, List<Menu> currentList, StringBuilder builder, bool isFirtRun = true)
for (int i = 0; i < currentList.Count; i++)
builder.Append(currentList[i].Name);
Console.WriteLine(builder.ToString());
builder.Length -= currentList[i].Name.Length;
if(mapping.ContainsKey(currentList[i].Id))
PrintDict(mapping, mapping[currentList[i].Id], builder, false);