2010-10-15 18 views
1

CompareTo方法邏輯如何在列表排序函數中工作。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()); 

回答

4

當一個泛型列表(列表中的情況下)上調用Sort method,幕後,排序的實施將檢查列表(person類)的類型實現了IComparable接口,如果確實如此它將調用CompareTo成員來執行列表元素之間的比較以執行排序。 person類實現IComparable的事實被解釋爲一個「合約」,它指定person類將有一個名爲CompareTo的方法。

排序的實現可以使用一個片段如以下要比較的列表的元素:

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 

內部,排序方法採用優化的快速排序實際執行排序而是使之更容易理解,這裏的這說明了什麼情況實施bubble 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); 
} 
+0

很難理解compareTo處理。 – 2010-10-15 15:07:07

+0

您是通過比較來處理什麼的? – 2010-10-15 15:14:00

+0

好吧,我收到你的舉例,我的意思是你在答案中寫的同樣的處理。謝謝。 – 2010-10-15 15:17:02

2

它按姓氏排序,然後名。

如果兩個人有相同的姓氏,則if聲明將最終以名字比較。
否則,它會按姓氏比較。