示例#1
0
        private void TopSortInternal(List <Pip> pips, List <List <Pip> > sortedPipGroups)
        {
            var childrenLeftToVisit = new Dictionary <Pip, int>();

            sortedPipGroups.Add(new List <Pip>());
            int totalAdded = 0;

            foreach (var pip in pips)
            {
                childrenLeftToVisit[pip] = 0;
            }

            foreach (var pip in pips)
            {
                foreach (var dependent in m_pipGraph.RetrievePipImmediateDependents(pip) ?? Enumerable.Empty <Pip>())
                {
                    childrenLeftToVisit[dependent]++;
                }
            }

            foreach (var pip in pips)
            {
                if (childrenLeftToVisit[pip] == 0)
                {
                    totalAdded++;
                    sortedPipGroups[sortedPipGroups.Count - 1].Add(pip);
                }
            }

            int currentLevel = sortedPipGroups.Count - 1;

            while (totalAdded < pips.Count)
            {
                sortedPipGroups.Add(new List <Pip>());
                foreach (var pip in sortedPipGroups[currentLevel])
                {
                    foreach (var dependent in m_pipGraph.RetrievePipImmediateDependents(pip) ?? Enumerable.Empty <Pip>())
                    {
                        if (--childrenLeftToVisit[dependent] == 0)
                        {
                            totalAdded++;
                            sortedPipGroups[currentLevel + 1].Add(dependent);
                        }
                    }
                }

                currentLevel++;
            }
        }