3

下面是一个l包含ProductwithNamePrice属性列表的列表。该列表可以通过以下ProductNameComparer实现IComparar的类按字母顺序排序。

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);
    }
}

我不明白列表是如何排序的。根据MSDN CompareTo返回一个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)进行比较和排序?

4

3 回答 3

10

Sort方法不只是调用Compare一次 - 它会在需要比较两个项目时多次调用它。这是一种通用的排序算法,可以对任何项目集合进行排序,只要它可以以一致的方式比较其中任何两个项目。

如果您尝试调用该代码将无法编译,l.Sort(-1)因为那只是尝试传入一个整数 - 这甚至意味着什么?

您需要了解您并没有给Sort方法一个比较结果- 您是在给它比较它需要的任何项目的能力。

于 2011-12-16T07:29:04.410 回答
7

出于演示的目的,这里是 Sort 方法的一种可能实现(我知道这是一种效率非常低的方法):

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;
            }
        }
    }
}
于 2011-12-16T07:46:13.137 回答
1

您的示例 ( ) 中使用的 Sort 方法重载new ProductNameComparer()需要参数来实现IComparer接口。调用Sort(-1)将不起作用,因为 int 没有实现此接口。根据@JonSkeet,CompareTo()排序策略使用调用结果对列表进行排序。

于 2011-12-16T07:40:36.097 回答