14

我想知道什么更好用。

IComparer 类和用于 List 上的排序或 LINQ orderby 的比较方法。两者都可以正常工作,但哪一个更适合大型列表。

4

3 回答 3

10

我会选择 LINQ 有两个原因。

  • LINQ 查询通常更短且更易于阅读。
  • 如果您确实有大量元素,Linq 还使您能够通过使用 PLinq扩展到多个 CPU 内核,这可能会大大帮助您。

如果您认为 OrderBy 子句中的 lambda 表达式编译为一个函数,我希望单线程实现的性能大致相似——这几乎是您通过实现 IComparer 获得的全部内容。

话虽如此,通过更改排序算法以适应数据的排序方式,而不是更改比较方法,您可能会获得更多的性能提升。但是今天早上我愿意打赌我的咖啡,你的 Linq 语句中的 OrderBy 使用了 Quicksort 的实现,所以在一般情况下它可能已经相当不错了。

于 2010-07-31T15:02:17.900 回答
4

对于所有基于集合的操作,我更喜欢默认使用 LINQ。这里的优点是我不必对所用集合的类型做太多假设(OrderBy 适用于 IEnumerable)。

如果你有一个IList<T>反正,那么 List.Sort 可能会更快。

无论如何,在出现经过验证(即测量)的性能问题之前,我不会担心它

于 2010-07-31T15:05:26.570 回答
2

我认为这两者在语义上是非常不同的,IComparer 接口让您可以定义您的类型如何自然排序,OrderBy 为您提供了一种通过某些特定键对对象进行排序的方法,例如,给定一个 Person 对象列表,用于查询 A 对列表进行排序名字,对于查询 B,按年龄对列表进行排序。

LINQ 为您提供了更大的灵活性,但是由于OrderBy需要一个 Func 来获取您的对象类型并返回一个用于排序的键,因此您返回的任何键仍然需要实现 IComparer 接口。

就大型列表的性能而言,取决于您在 Compare 方法中所做的事情,我想象的两种方法之间可能几乎没有区别,尽管最好仅针对您的类型进行测试。

于 2010-07-31T15:19:49.567 回答