LINQ orderby vs IComparer

我想知道什么是更好用。

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

我会选择LINQ有两个原因。

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

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

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

我更喜欢在所有基于集合的操作中使用LINQ。 这里的优点是我不必过多考虑所使用的集合的类型(OrderBy适用于IEnumerable)。

如果你有一个IList ,那么List.Sort可能会更快。

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

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

LINQ为您提供了更大的灵活性,但由于OrderBy需要一个Func,它接受您的对象类型并返回一个用于排序的键,无论您返回什么键,仍然需要实现IComparer接口。

就大型列表的性能而言,根据你在Compare方法中所做的事情,我想象的两种方法之间可能差别很小,尽管最好只针对你的类型进行测试。