2011-12-16 191 views
3

下面,列表l包含Product列表NamePrice屬性。 該列表可以按照以下類別ProductNameComparer按字母順序排列,它們實施ICompararCompareTo如何對列表進行排序?

List<Product> l = p.GetList(); 
l.Sort(new ProductNameComparer()); 
MessageBox.Show(l[0].Name); 

public class ProductNameComparer : IComparer<Product> 
{ 
    public int Compare(Product x, Product y) 
    { 
     return x.Name.CompareTo(y.Name); 
    } 
} 

我不明白如何排序列表。根據MSDNCompareTo返回一個的Int32類型值小於零,或大於零。如果我有:

string c = "Apple"; 
string d = "Orange"; 
return c.CompareTo(d) 

函數將返回 「-1」。

但是,如果我取代的l.Sort(-1)代替l.Sort(new ProductNameComparer())代碼不編譯

而且爲什麼會Compare(Product x, Product y)只有兩個產品作爲參數,但管理進行比較和排序列表(> 2)的產品呢?

+0

您在這裏有兩個問題。您是否已經理解排序算法的基礎知識,如QuickSort,MergeSort,Insertion Sort? – JasonTrue 2011-12-16 07:29:31

回答

10

Sort方法不會只調用Compare一次 - 它會多次調用它,只要它需要比較兩個項目。這是一種通用的排序算法,它能夠對任何項目集合進行排序,只要它能以一致的方式比較任意兩個項目。

如果您嘗試撥打l.Sort(-1),代碼不會編譯,因爲它只是試圖傳入一個整數 - 這意味着什麼?

您需要明白,您不會給Sort方法一個比較結果 - 您可以讓它能夠比較它需要的任何項目。

1

您示例中使用的排序方法過載(new ProductNameComparer())需要該參數來實現接口IComparer。調用Sort(-1)將不起作用,因爲int不實現此接口。根據@JonSkeet,排序策略使用調用CompareTo()的結果來排序列表。

6

出於演示的目的,這裏是一個可能實現的排序方法的(一個非常低效的,我知道):

public void Sort(System.Collections.Generic.IComparer<T> comparer) 
{ 
    for (int i = 0; i < this.Count - 1; i++) 
    { 
     for (int j = i + 1; j < this.Count; j++) 
     { 
      if (comparer.Compare(this[i], this[j]) > 0) 
      { 
       T tmp = this[i]; 
       this[i] = this[j]; 
       this[j] = tmp; 
      } 
     } 
    } 
}