CompareTo如何对列表进行排序?

KMC*_*KMC 3 .net c# sorting compareto

下面是一个l包含Productwith NamePrice属性列表的列表.该列表可以通过以下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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白列表是如何排序的.根据MSDN CompareTo返回的Int32类型值小于零,大于零.如果我有:

string c = "Apple";
string d = "Orange";
return c.CompareTo(d)
Run Code Online (Sandbox Code Playgroud)

该函数将返回" -1 ".

但是,如果我更换l.Sort(-1),而不是l.Sort(new ProductNameComparer())代码不编译

另外,为什么Compare(Product x, Product y)只需要两个产品作为参数,并设法比较和排序产品列表(> 2)?

Jon*_*eet 10

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

如果你试图调用代码就不会编译,l.Sort(-1)因为那只是试图传入一个整数 - 这甚至意味着什么?

您需要了解您没有给出Sort方法一个比较结果 - 您可以让它能够比较它需要的任何项目.


taf*_*afa 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)