using System.Collections;
using System.Collections.Generic;
public List<Node<T>> Children { get; set;}
Children = new List<Node<T>>();
public List<Node<T>> LevelOrder()
List<Node<T>> list = new List<Node<T>>();
Queue<Node<T>> queue = new Queue<Node<T>>();
Node<T> temp = queue.Dequeue();
foreach (Node<T> child in temp.Children)
public List<Node<T>> PreOrder()
List<Node<T>> list = new List<Node<T>>();
foreach (Node<T> child in Children)
list.AddRange(child.PreOrder());
public List<Node<T>> PostOrder()
List<Node<T>> list = new List<Node<T>>();
foreach (Node<T> child in Children)
list.AddRange(child.PreOrder());
public string menuName {get;set;}
public int? parentID {get;set;}
public bool isHidden {get;set;}
public string linkURL {get;set;}
public static void Main()
var data = @"ID;MenuName;ParentID;isHidden;LinkURL
1;Company;NULL;False;/company
2;About Us;1;False;/company/aboutus
3;Mission;1;False;/company/mission
4;Team;2;False;/company/aboutus/team
5;Client 2;10;False;/references/client2
6;Client 1;10;False;/references/client1
7;Client 4;10;True;/references/client4
8;Client 5;10;True;/references/client5
10;References;NULL;False;/references";
var lines = data.Split('\n');
var rootNodes = new List<Node<Entity>>();
var childItems = new List<Entity>();
foreach(var row in lines.Skip(1))
var columns = row.Split(';');
var id = Convert.ToInt32(columns[0]);
var menuName = columns[1];
var parentID = ToNullableInt(columns[2]);
var isHidden = Convert.ToBoolean(columns[3]);
var linkURL = columns[4];
var entity = new Entity()
Console.WriteLine("Found root:" + entity.id + " - " + entity.menuName);
rootNodes.Add(new Node<Entity>()
foreach(var rootNode in rootNodes)
foreach(var childItem in childItems.OrderBy(a=>a.parentID).ThenBy(b=>b.menuName))
var newNode = new Node<Entity>()
Insert(rootNode, newNode);
Console.WriteLine("-------------------");
foreach(var rootNode in rootNodes)
foreach(var node in rootNode.LevelOrder())
if(node.Data.isHidden) continue;
if(previous.Data.parentID != node.Data.parentID)
for(var i = 0; i < indent; i++)
Console.WriteLine(node.Data.id + " - " + node.Data.menuName);
public static void Insert(Node<Entity> rootNode, Node<Entity> targetNode)
foreach(var current in rootNode.LevelOrder())
if(current.Data.id == targetNode.Data.parentID)
current.Children.Add(targetNode);
public static int? ToNullableInt(string s)
if (int.TryParse(s, out i)) return i;