Когда вы вызываете метод Sort в общем списке (List в вашем случае), за кулисами реализация Sort проверит, реализует ли тип списка (класс person
) интерфейс IComparable , и в этом случае он вызовет элемент CompareTo для сравнения элементов списка для выполнения сортировки. Тот факт, что класс person
реализует IComparable, интерпретируется как «контракт», который указывает, что класс person
будет иметь метод с именем CompareTo.
Реализация Sort может использовать фрагмент, такой как следующий, чтобы сравнить с элементами списка:
T aPerson;
T anotherPerson;
int compareResult;
if(aPerson is IComparable)
{
compareResult = (aPerson as IComparable).CompareTo(anotherPerson);
}
Метод CompareTo всегда сравнивает объект, для которого он вызван, с параметром, и значение возвращаемого значения всегда одинаково:
* if the two objects are "equal", it returns 0
* if the object you are comparing to is "less than" - in a sorted list it goes before - the object you are invoking CompareTo on, it returns -1
* if the object you are comparing to is "greater than" - in a sorted list it goes after - the object you are invoking CompareTo on, it returns +1
Внутренне, метод Sort использует оптимизированную быструю сортировку, чтобы фактически выполнить сортировку, но для упрощения отслеживания, вот пример реализации пузырьковой сортировки , которая иллюстрирует, что происходит за кулисами с точки зрения вызова IComparable интерфейс:
// assume the Sort invokes this naive bubble sort
// on the internal backing array of the list
void InternalBubbleSort(T[] backingArray)
{
var swapped = false;
do {
swapped = false;
for(int i = 0; i < Length - 1; i++) {
if (backingArray[i].CompareTo(backingArray[i+1]) > 0) {
T temp = backingArray[i];
backingArray[i] = backingArray[i+1];
backingArray[i+1] = temp;
swapped = true;
}
}while(swapped);
}