Ответ вы связаны правильно. Ключ в сортировке по нескольким значениям состоит в том, что вторичное свойство имеет значение только в том случае, если первичные значения равны. Реализация psuedocode вашего сравнения сортировки может быть:
compare x and y position
if they differ, return order
else compare name, return order
О методе Sort
код после (x,y)=>
должен возвращать 0, если элементы равны, отрицательное число, если первый должен быть перед вторым, и положительное число, если второе должно быть до первого. Метод CompareTo
будет возвращать -1, 0 или 1 на основе этих случаев и аргументов. Поскольку вам нужно сравнить два разных свойства, вам необходимо два вызова CompareTo
. Если вы решили добавить их вместе, вы могли бы иметь дело так:
- x.position < y.position (сравните возвращает -1)
- x.name> y.name (сравните возвращается 1)
- результат 0, считаются равными, где ваши правила ясно говорят, что x должен быть первым в этом случае.
Для решения этой проблемы нам необходимо убедиться, что сравнение имен имеет значение, когда позиции равны. Так как CompareTo
возвращает только -1, 0 или 1, если мы умножим результат позиции на 2 (или любое большее число), тогда сравнение по имени изменит результат только в том случае, если позиции равны. (Потому что -2 + 1 = -1
и 2 - 1 = 1
)
Таким образом, используя метод, описанный в исходной связанный ответ, ваш код будет что-то вроде:
list.Sort((x, y) =>
2 * x.Position.CompareTo(y.Position)
+ x.Name.CompareTo(y.Name));
@ Хамма: Надеюсь, это поможет вам понять, почему существует размножение. Вы также должны рассмотреть ответ Рене Хильгерса. Он создает новый список, но если вы делаете этот сорт много раз, а ваш список довольно велик, и вы пытаетесь избежать GC, вам, вероятно, не нужно беспокоиться о создании нового списка для этого типа. – mao47
Я работаю с разными потоками, которые одновременно открывают и изменяют список через блокировки, поэтому моя задача - сделать операции как можно быстрее и эффективнее. Я понимаю, что умножение - это дать иерархию двум свойствам. – Hamma