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);
        }