private List <Library> GetSortedLibraries(Library rootLibrary) { var traversed = new List <Library>(); var topologicalSort = new TopologicalSort <Library>(); var toTraverse = new Queue <Library>(); toTraverse.Enqueue(rootLibrary); while (toTraverse.Count > 0) { Library predecessor = toTraverse.Dequeue(); if (traversed.Any(l => l.Equals(predecessor)) == false) { traversed.Add(predecessor); } topologicalSort.Node(predecessor); foreach (Library successor in predecessor.Dependencies) { Library realSuccessor = traversed.Find(t => t.Equals(successor)); if (realSuccessor == null) { if (toTraverse.Any(l => l.Equals(successor)) == false) { toTraverse.Enqueue(successor); } realSuccessor = successor; if (traversed.Any(l => l.Equals(realSuccessor)) == false) { traversed.Add(realSuccessor); } } topologicalSort.Edge(predecessor, realSuccessor); } } Queue <Library> sorted = topologicalSort.Sort(); List <Library> allLibraries = sorted.ToList(); return(allLibraries); }