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++; } }