CompareTo如何对列表进行排序?

时间:2011-12-16 07:25:13

标签: c# .net sorting compareto

下面是一个列表l,其中包含ProductNamePrice个属性的列表。 该列表可以通过以下类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);
    }
}

我不明白列表是如何排序的。根据{{​​3}} 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)仅将两个产品作为参数,并设法对产品列表(&gt; 2)进行比较和排序?

3 个答案:

答案 0 :(得分:10)

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

如果您尝试拨打l.Sort(-1),代码就无法编译,因为它只是试图传入一个整数 - 这甚至意味着什么?

您需要了解自己没有提供Sort方法一个比较结果 - 您可以让它能够比较所需的任何项目。

答案 1 :(得分:6)

为了演示的目的,这里有一个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;
            }
        }
    }
}

答案 2 :(得分:1)

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