Beispiel #1
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #2
0
            public TraversingInfo SetParent(TraversingInfo parent)
            {
                this.Distance = parent.Distance + 1;
                this.Path     = parent.Path.ToList();
                this.Path.Add(parent.Node.Key);

                return(this);
            }