LINQ orderby和IComparer的比较

14

我想知道使用哪种方法更好。

是使用IComparer类和Compare方法进行排序还是在List上使用LINQ orderby。两者都可以正常工作,但哪一种对于大型列表来说更好。

3个回答

10

我会选择LINQ,有两个原因。

  • LINQ查询通常较短且易于阅读。
  • 如果你确实有大量元素,使用PLinq可以通过利用多个CPU核心进行扩展,这可能会显著提高效率。

如果考虑到OrderBy子句中的lambda表达式会编译为函数(这基本上就是通过实现IComparer所获取的),那么在单线程实现方面,性能预计会相当。

话虽如此,你可能会通过将排序算法更改为适合数据已经排序方式的算法来获得更好的性能提升,而不是通过更改比较方法来实现。但我愿意打赌今天早上的咖啡,你Linq语句中的OrderBy使用了快速排序的实现,在一般情况下它应该已经非常不错了。


4

我更喜欢默认使用LINQ进行所有基于集合的操作。这样做的好处是我不必过多地假设所使用的集合类型(OrderBy适用于IEnumerable)。

如果您已经有一个IList<T>,那么List.Sort可能会更快。

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


2

我认为从语义上讲,这两者是非常不同的。IComparer接口允许您定义如何自然排序您的类型,而OrderBy提供了一种按某个特定键对对象进行排序的方法。例如,给定一个Person对象列表,对于查询A,按FirstName对列表进行排序,对于查询B,按Age对列表进行排序。

LINQ提供了更多的灵活性,但是由于OrderBy需要一个Func,该函数将使用于排序的关键字返回您的对象类型,因此您返回的任何关键字仍需要实现IComparer接口。

在大型列表上的性能方面,根据Compare方法中所做的工作,我想这两种方法之间可能几乎没有区别,但最好针对您的类型进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接