public IEnumerable <T> DependenciesDeep(T node) { var discoveredDeps = new KeyedCollection <string, T>(_getKey); IEnumerable <T> InnerDescendentDeps(T n) { var childDeps = Dependencies(n).ToList(); foreach (var dep in childDeps.Where(c => !discoveredDeps.Contains(c))) { yield return(discoveredDeps.AddItem(dep)); } foreach (var dep in childDeps.SelectMany(InnerDescendentDeps)) { yield return(dep); } } foreach (var dep in InnerDescendentDeps(node)) { yield return(dep); } }