Что должен вернуть IComparer, чтобы указать сохранение существующего порядка сортировки

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

Иногда я обнаруживаю, что хочу сохранить существующий порядок элементов, в этом случае что я должен вернуть из реализации моего метода Compare? Достаточно ли просто вернуть 0 или мне нужно активно определять, какой элемент появился первым?


person Justin    schedule 08.04.2013    source источник
comment
Я почти уверен, что возврат 0 оставит соседние элементы как есть   -  person valverij    schedule 08.04.2013
comment
@valverij Это то, что я думаю, однако, согласно документации, это технически означает x равно y, что теоретически означает, что сортировщик может расположить эти два элемента в любом порядке, который он выберет.   -  person Justin    schedule 08.04.2013
comment
Это зависит от того, что вы используете для упорядочивания, Enumerable.OrderBy выполняет стабильную сортировку, List<T>.Sort не является стабильной, поэтому он может переупорядочивать одинаковые элементы.   -  person Lee    schedule 08.04.2013
comment
@Lee Фантастический, только что нашел стабильность в Википедии, а также примечания в OrderBy и Сортировать документацию, объясняющую, что они стабильны и нестабильны соответственно - это отлично отвечает на мой вопрос   -  person Justin    schedule 08.04.2013
comment
@Justin, вместо того, чтобы полагаться на то, что другие заинтересованные пользователи читают комментарии, стоило бы добавить быстрый ответ на свой вопрос, чтобы люди знали, что здесь есть что-то полезное. Тоже интересный вопрос!   -  person Alex    schedule 08.04.2013
comment
@ Алекс Я ждал, чтобы увидеть, преобразовал ли Ли сначала свой комментарий в ответ   -  person Justin    schedule 08.04.2013
comment
@Justin, честно говоря, просто подумал, что укажу на это на случай, если это превратится в вопрос «выстрелил и забыл» :)   -  person Alex    schedule 08.04.2013


Ответы (2)


(За этот ответ отвечает Lee )

Это зависит от того, является ли алгоритм, используемый для сортировки стабильным. Например, OrderBy работает стабильно, поэтому возврат 0 из Compare приведет к означает, что два элемента сохраняют свой первоначальный порядок в списке, однако List.Sort нет, поэтому возврат 0 из Compare не гарантирует, что два элемента будут в исходном порядке в отсортированном выводе.

person Justin    schedule 10.04.2013

Ноль, но ваш алгоритм сортировки может изменить свой порядок.

person NthDeveloper    schedule 10.04.2013