LINQ orderby vs IComparer

时间:2010-07-31 14:50:52

标签: c# linq icomparer

我想知道什么是更好用。

用于排序的IComparer类和比较方法或列表上的LINQ orderby。两者都很好,但哪一个更适合大型列表。

3 个答案:

答案 0 :(得分:10)

我会选择LINQ有两个原因。

  • LINQ查询通常更短且更易于阅读。
  • 如果您确实拥有大量元素,Linq还可以使用PLinq scale out to multiple CPU cores,这可能会对您有所帮助。

如果你认为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方法中所做的事情,我想象的两种方法之间可能差别很小,尽管最好只针对你的类型进行测试。