【问题标题】:LINQ orderby vs IComparerLINQ orderby vs IComparer
【发布时间】:2010-07-31 14:50:52
【问题描述】:

我想知道什么更好用。

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

【问题讨论】:

    标签: c# linq icomparer


    【解决方案1】:

    我会选择 LINQ 有两个原因。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        我认为这两者在语义上是非常不同的,IComparer 接口让你可以定义你的类型是如何自然排序的,OrderBy 让你可以通过一些特定的键对你的对象进行排序,例如给定一个 Person 对象列表,对于查询 A,按 First Name 对列表进行排序,对于查询 B,按 Age 对列表进行排序。

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多