【问题标题】:How does CompareTo sort a list?CompareTo 如何对列表进行排序?
【发布时间】:2011-12-16 07:25:13
【问题描述】:

下面是l 列表,其中包含Product 列表以及NamePrice 属性。 该列表可以按字母顺序按以下类 ProductNameComparer 进行排序,该类实现 ICompar

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) 进行比较和排序?

【问题讨论】:

  • 这里有两个问题。您是否已经了解快速排序、合并排序、插入排序等排序算法的基础知识?

标签: c# .net sorting compareto


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    出于演示的目的,这里是 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;
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        相关资源
        最近更新 更多