Ejemplo n.º 1
0
        private List <Library> GetSortedLibraries(Library rootLibrary)
        {
            var traversed       = new List <Library>();
            var topologicalSort = new TopologicalSort <Library>();

            var toTraverse = new Queue <Library>();

            toTraverse.Enqueue(rootLibrary);
            while (toTraverse.Count > 0)
            {
                Library predecessor = toTraverse.Dequeue();
                if (traversed.Any(l => l.Equals(predecessor)) == false)
                {
                    traversed.Add(predecessor);
                }
                topologicalSort.Node(predecessor);
                foreach (Library successor in predecessor.Dependencies)
                {
                    Library realSuccessor = traversed.Find(t => t.Equals(successor));

                    if (realSuccessor == null)
                    {
                        if (toTraverse.Any(l => l.Equals(successor)) == false)
                        {
                            toTraverse.Enqueue(successor);
                        }

                        realSuccessor = successor;

                        if (traversed.Any(l => l.Equals(realSuccessor)) == false)
                        {
                            traversed.Add(realSuccessor);
                        }
                    }

                    topologicalSort.Edge(predecessor, realSuccessor);
                }
            }

            Queue <Library> sorted       = topologicalSort.Sort();
            List <Library>  allLibraries = sorted.ToList();

            return(allLibraries);
        }