public static IEnumerable <T> OrderByDependencies <T>(this IEnumerable <T> items) where T : class { if (items == null) { throw new ArgumentNullException(nameof(items)); } var nodes = items.Distinct().ToHashSet(); var edges = items.SelectMany(GetEdges).Select(item => ToEdge(item.Item1, item.Item2, items)).ToHashSet(); return(TopologicalSort.DestructiveOptimized(nodes, edges)); }