internal void SortGroups(List <GroupSortComparer> groupSortComparers, int level) { int itemCount = this.ProtectedItemCount; if (itemCount == 0) { return; } int[] indexes; indexes = new int[itemCount + 1]; for (int i = 0; i < itemCount; i++) { indexes[i] = i; } DataGridCollectionViewGroup[] subGroupsArray = new DataGridCollectionViewGroup[itemCount]; m_subGroups.Values.CopyTo(subGroupsArray, 0); // "Weak heap sort" sort array[0..NUM_ELEMENTS-1] to array[1..NUM_ELEMENTS] DataGridCollectionViewGroupSort collectionViewSort = new DataGridCollectionViewGroupSort(indexes, groupSortComparers[level], subGroupsArray); collectionViewSort.Sort(itemCount); level++; m_protectedItems.Clear(); for (int i = 1; i <= itemCount; i++) { DataGridCollectionViewGroup group = subGroupsArray[indexes[i]]; // Sort sub groups if (!group.IsBottomLevel) { group.SortGroups(groupSortComparers, level); } m_protectedItems.Add(group); } this.ProtectedItemCount = m_protectedItems.Count; m_protectedItemsCollectionChanged.Invoke(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); }