Почему мой метод List.Sort в C # меняет порядок моего списка? - PullRequest
4 голосов
/ 20 апреля 2010

У меня есть список элементов в общем списке:

  • А1 (индекс сортировки 1)
  • A2 (индекс сортировки 2)
  • B1 (индекс сортировки 3)
  • B2 (индекс сортировки 3)
  • B3 (индекс сортировки 3)

Компаратор по ним принимает вид:

this.sortIndex.CompareTo(other.sortIndex)

Когда я делаю List.Sort () в списке элементов, я получаю следующий порядок:

  • A1
  • A2
  • B3
  • В2 * +1027 *
  • B1

Очевидно, это работало в том смысле, что индексы сортировки находятся в правильном порядке, но я действительно не хочу, чтобы он переупорядочивал элементы 'B'.

Могу ли я внести какие-либо изменения в мой компаратор, чтобы это исправить?

Ответы [ 5 ]

5 голосов
/ 20 апреля 2010

OrderBy сохраняет порядок на равные предметы:

myList = myList.OrderBy(item => item.SortIndex).ToList();
5 голосов
/ 20 апреля 2010

вам нужно использовать алгоритм " stable sort ", если вы не хотите, чтобы элементы, равные позиции изменения,

Проверьте " сортировка слиянием " для примера стабильного алгоритма сортировки. Вот реализация этого в C #.

2 голосов
/ 04 мая 2012

StableSort() метод расширения для List<T> - здесь

1 голос
/ 20 апреля 2010

Сортировка использует QuickSort, и она не гарантирует исходную последовательность в случае равенства сравнения.

Если вы все еще хотите использовать List.Sort, вы можете добавить второе сравнение с исходным индексом, например:

int c = this.sortIndex.CompareTo(other.sortIndex);
if (c == 0)
  c = this.originalIndex.CompareTo(other.originalIndex);
return c;

в противном случае вы можете выполнять сортировку с помощью других «стабильных» алгоритмов (например, LINQ OrderBy).

1 голос
/ 20 апреля 2010

Вы можете изменить компаратор для выполнения вторичной сортировки по значению:

if (this.sortIndex.CompareTo(other.sortIndex) == 0) // same sortIndex
{
   return this.Value.CompareTo(other.Value);
}
return 0;
...