【发布时间】:2010-07-31 14:50:52
【问题描述】:
我想知道什么更好用。
IComparer 类和用于 List 上的排序或 LINQ orderby 的比较方法。两者都可以正常工作,但哪一个更适合大型列表。
【问题讨论】:
我想知道什么更好用。
IComparer 类和用于 List 上的排序或 LINQ orderby 的比较方法。两者都可以正常工作,但哪一个更适合大型列表。
【问题讨论】:
我会选择 LINQ 有两个原因。
如果您认为 OrderBy 子句中的 lambda 表达式编译为一个函数,我希望单线程实现的性能大致相似——无论如何,这几乎是您通过实现 IComparer 获得的全部。
话虽如此,通过更改排序算法以适应数据的排序方式,而不是更改比较方法,您可能会获得更多的性能提升。但是今天早上我愿意打赌我的咖啡,你的 Linq 语句中的 OrderBy 使用了 Quicksort 的实现,所以在一般情况下它可能已经相当不错了。
【讨论】:
我更喜欢在默认情况下对所有基于集合的操作使用 LINQ。这里的优点是我不必对所用集合的类型做出太多假设(OrderBy 适用于 IEnumerable)。
如果你有一个IList<T>,那么 List.Sort 可能会更快。
无论如何,在存在已证明(即测量的)性能问题之前,我不会担心它
【讨论】:
我认为这两者在语义上是非常不同的,IComparer 接口让你可以定义你的类型是如何自然排序的,OrderBy 让你可以通过一些特定的键对你的对象进行排序,例如给定一个 Person 对象列表,对于查询 A,按 First Name 对列表进行排序,对于查询 B,按 Age 对列表进行排序。
LINQ 为您提供了更大的灵活性,但由于 OrderBy 需要一个 Func,它接受您的对象类型并返回一个用于排序的键,因此您返回的任何键仍然需要实现 IComparer 接口。
就大型列表的性能而言,取决于您在 Compare 方法中所做的事情,我想象的两种方法之间可能几乎没有区别,但最好仅针对您的类型进行测试。
【讨论】: