using System.Collections.Generic;
public int? PredecessorId;
public static void Main()
var loads = new List<Load>();
var sortedloads = new List<Load>();
var loadA1 = new Load() {Id = 1, PredecessorId = null , Name ="loadA1"};
var loadA2 = new Load() {Id = 2, PredecessorId = loadA1.Id, Name ="loadA2"};
var loadA3 = new Load() {Id = 3, PredecessorId = loadA2.Id, Name ="loadA3"};
var loadB1 = new Load() {Id = 4, PredecessorId = null, Name ="loadB1"};
var loadB2 = new Load() {Id = 5, PredecessorId = loadB1.Id, Name ="loadB2"};
var loadB3 = new Load() {Id = 6, PredecessorId = loadB2.Id, Name ="loadB3"};
var loadB4 = new Load() {Id = 7, PredecessorId = loadB3.Id, Name ="loadB4"};
loads = loads.OrderBy(q => !loads.Any(load => load.Id == q.PredecessorId)).ThenBy(q => q.PredecessorId == null).ToList();
Console.WriteLine("Finished" + count++);
sortedloads.AddRange(loads.Where(q => !loads.Any(p => q.PredecessorId == p.Id)));
loads.RemoveAll(load => sortedloads.Contains(load));
foreach(var load in sortedloads)
Console.WriteLine("Name:" + load.Name + ", ID: " + load.Id + ", Predecessor ID: " + load.PredecessorId);