我想知道什么是更好用。
用于排序的IComparer类和比较方法或列表上的LINQ orderby。两者都很好,但哪一个更适合大型列表。
答案 0 :(得分:10)
我会选择LINQ有两个原因。
如果你认为OrderBy子句中的lambda表达式编译成一个函数,我希望单线程实现的性能大致相似 - 无论如何都是通过实现IComparer得到的。
话虽这么说,通过更改排序算法以适应数据的排序方式,而不是通过更改比较方法,可以提高性能。但是我愿意今天早上打赌我的咖啡,你的Linq语句中的OrderBy使用了Quicksort的实现,所以在一般情况下它可能已经相当不错了。
答案 1 :(得分:4)
我更喜欢在所有基于集合的操作中使用LINQ。这里的优点是我不必过多地假设所使用的集合的类型(OrderBy适用于IEnumerable)。
如果你有IList<T>
,那么List.Sort可能会更快。
无论如何,在经过验证(即测量)性能问题之前我不会担心它
答案 2 :(得分:2)
我认为两者在语义上是非常不同的,IComparer接口允许您自然地定义类型的排序方式,OrderBy为您提供了一种通过某些特定键对对象进行排序的方法,例如:给定一个Person对象列表,对于查询A按名字排序列表,对于查询B按列表对列表进行排序。
LINQ为您提供了更大的灵活性,但由于OrderBy需要一个Func来获取您的对象类型并返回一个用于排序的键,因此您返回的任何键仍然需要实现IComparer接口。
就大型列表的性能而言,根据你在Compare方法中所做的事情,我想象的两种方法之间可能差别很小,尽管最好只针对你的类型进行测试。