C# LINQ orderby vs IComparer

C# LINQ orderby vs IComparer,c#,linq,icomparer,C#,Linq,Icomparer,我想知道什么更好用 列表上排序或LINQ orderby的IComparer类和比较方法。这两种方法都很好,但哪一种更适合大型列表。我选择LINQ有两个原因 LINQ查询通常较短且易于阅读 如果您确实拥有大量的元素,Linq还可以通过使用PLinq来帮助您,这可能会对您有很大帮助 我预计,单线程实现的性能大致相似,如果您认为OrrdBy子句中的lambda表达式编译成函数——这几乎完全是通过实现ICOMPARER得到的。 也就是说,通过更改排序算法以适应数据已排序的方式,而不是更改比较方法,

我想知道什么更好用


列表上排序或LINQ orderby的IComparer类和比较方法。这两种方法都很好,但哪一种更适合大型列表。

我选择LINQ有两个原因

  • LINQ查询通常较短且易于阅读
  • 如果您确实拥有大量的元素,Linq还可以通过使用PLinq来帮助您,这可能会对您有很大帮助

我预计,单线程实现的性能大致相似,如果您认为OrrdBy子句中的lambda表达式编译成函数——这几乎完全是通过实现ICOMPARER得到的。


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

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

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


无论如何,在出现已证实(即测量)的性能问题之前,我不会担心这一点。

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

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

就大型列表的性能而言,取决于您在比较方法中所做的工作,我认为这两种方法之间的差异可能很小,不过最好只针对您的类型进行测试