private static List <Item> MoreOrLessTopologicalSort(IEnumerable <Dependency> edges) { Dictionary <Item, List <Dependency> > dependencies2ItemsAndDependencies = Dependency.Dependencies2ItemsAndDependenciesList(edges); var result = new List <Item>(); var resultAsHashSet = new HashSet <Item>(); var candidates = new List <Item>(dependencies2ItemsAndDependencies.Keys.OrderBy(n => n.Name)); while (candidates.Any()) { Item best = FindBest(candidates, true, dependencies2ItemsAndDependencies) ?? FindBest(candidates, false, dependencies2ItemsAndDependencies); if (best == null) { throw new Exception("Error in algorithm - no best candidate found"); } result.Add(best); resultAsHashSet.Add(best); candidates.Remove(best); foreach (var es in dependencies2ItemsAndDependencies.Values) { es.RemoveAll(e => e.UsedItem.Equals(best)); } } result.Reverse(); return(result); }