2011-12-16 123 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; 
      } 
     } 
    } 
}