Как работает логика метода CompareTo в функции сортировки списка? - PullRequest
1 голос
/ 15 октября 2010

Как работает логика метода CompareTo в функции сортировки списка.

public class person : IComparable
{
    string firstName;
    string lastName;

    public int CompareTo(object obj)
    {
        person otherPerson = (person)obj;
        if (this.lastName != otherPerson.lastName)
            return this.lastName.CompareTo(otherPerson.lastName);
        else
            return this.firstName.CompareTo(otherPerson.firstName);
    }

    public person(string _firstName, string _lastName)
    {
        firstName = _firstName;
        lastName = _lastName;
    }

    override public string ToString()
    {
        return firstName + " " + lastName;
    }
}

List<person> l = new List<person>();
l.Add(new person("Mark", "Hanson"));
l.Add(new person("Kim", "Akers"));
l.Add(new person("Zsolt", "Ambrus"));

l.Sort();

foreach (person p in l)
    Console.WriteLine(p.ToString());

Ответы [ 2 ]

4 голосов
/ 15 октября 2010

Когда вы вызываете метод 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);
}
2 голосов
/ 15 октября 2010

Сортировка выполняется по фамилии, а затем по имени.

Если два человека имеют одинаковую фамилию, оператор if будет сравнивать по имени.
В противном случае он будет сравниваться пофамилия.

...