private IEnumerable <DependencyInfo> GetDescendantDeps(IEnumerable <Node> parents) { foreach (var parent in parents) { var visited = parent.Children.ToDictionary( child => child.Key, child => new TraversingInfo(child)); var todo = new Queue <TraversingInfo>(visited.Values); while (todo.Count > 0) { var current = todo.Dequeue(); yield return(new DependencyInfo { Parent = parent.Key, Child = current.Node.Key, Distance = current.Distance, Path = current.Path }); foreach (var child in current.Node.Children) { if (!visited.ContainsKey(child.Key)) { var item = new TraversingInfo(child).SetParent(current); visited.Add(child.Key, item); todo.Enqueue(item); } } } } }
public TraversingInfo SetParent(TraversingInfo parent) { this.Distance = parent.Distance + 1; this.Path = parent.Path.ToList(); this.Path.Add(parent.Node.Key); return(this); }