下面是一个列表l
,其中包含Product
个Name
和Price
个属性的列表。
该列表可以通过以下类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)进行比较和排序?
答案 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()
的结果来排序列表。