using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
var items = new List<DummyData>()
new DummyData() { Id = 1, Parent = 0 },
new DummyData() { Id = 2, Parent = 0 },
new DummyData() { Id = 3, Parent = 0 },
new DummyData() { Id = 4, Parent = 0 },
new DummyData() { Id = 5, Parent = 0 },
new DummyData() { Id = 6, Parent = 0 },
new DummyData() { Id = 7, Parent = 0 },
new DummyData() { Id = 11, Parent = 1 },
new DummyData() { Id = 111, Parent = 11 },
new DummyData() { Id = 1111, Parent = 111 },
new DummyData() { Id = 22, Parent = 2 },
new DummyData() { Id = 222, Parent = 22 },
new DummyData() { Id = 12, Parent = 1 },
new DummyData() { Id = 121, Parent = 12},
new DummyData() { Id = 1221, Parent = 121 },
new DummyData() { Id = 13, Parent = 1 },
new DummyData() { Id = 131, Parent = 13 },
new DummyData() { Id = 1311, Parent = 131 },
new DummyData() { Id = 41, Parent = 4 },
new DummyData() { Id = 441, Parent = 41 },
new DummyData() { Id = 4441, Parent = 441 },
new DummyData() { Id = 42, Parent = 2 },
new DummyData() { Id = 442, Parent = 42 },
new DummyData() { Id = 4442, Parent = 442 },
var mapped = items.Where(i => i.Parent == 0).Select(i => new Dummy() {
Dummies = items.Where(i_2 => i_2.Parent == i.Id).Select(i_2 =>
Dummies = items.Where(i_3 => i_3.Parent == i_2.Id).Select(i_3 =>
Dummies = items.Where(i_4 => i_4.Parent == i_3.Id).Select(i_4 =>
Dummies = new List<Dummy>()
var recursiveMapped = BuildTree(items);
Console.WriteLine("Brute force mapping:");
mapped.ForEach(d => Console.Write(d.ToString() + "\n\n\n"));
Console.WriteLine("Recursive mapping:");
recursiveMapped.ForEach(d => Console.Write(d.ToString() + "\n\n\n"));
public static List<Dummy> BuildTree(List<DummyData> source, int parent = 0)
return source.Where(i => i.Parent == parent).Select(i => new Dummy() {
Dummies = BuildTree(source, i.Id)
public int Id { get; set; }
public int Parent { get; set; }
public int Id { get; set; }
public List<Dummy> Dummies { get; set; }
public string ToString(string indent = "\t") {
var output = indent + this.Id.ToString();
output += ": \n" + d.ToString();