public IEnumerable<TElement> TopologicalSort<TElement, TKey>( IList<TElement> elements, Func<TElement, TKey> selector, IPartialComparer<TKey> comparer ) { var search = new DepthFirstSearch<TElement, TKey>( elements, selector, comparer ); return search.VisitAll(); }
public IEnumerable<TElement> TopologicalSort<TElement>( IList<TElement> elements, IPartialComparer<TElement> comparer ) { var search = new DepthFirstSearch<TElement, TElement>( elements, element => element, comparer ); return search.VisitAll(); }
public DepthFirstSearch( IList<TElement> elements, Func<TElement, TKey> selector, IPartialComparer<TKey> comparer ) { _elements = elements; _selector = selector; _comparer = comparer; var referenceComparer = new ReferenceEqualityComparer<TElement>(); _visited = new HashSet<TElement>(referenceComparer); _keys = elements.ToDictionary( e => e, e => _selector(e), referenceComparer ); _sorted = new List<TElement>(); }