2011-05-25 120 views
2

我试图想出一套链接OrderBy/ThenBy扩展方法调用,它等效于使用orderby关键字的LINQ语句。LINQ orderby关键字与OrderBy扩展方法的等效排序

使用orderby关键字我的LINQ语句如下所示:

List<Summary> sortedSummaries = new List<Summary>(
    from summary in unsortedSummaries 
    orderby summary.FieldA ascending, 
      summary.FieldB ascending, 
      summary.FieldC ascending, 
      summary.FieldD ascending 
    select summary); 

现在,我猜想,等价版本,采用链式OrderBy/ThenBy扩展方法的调用是这样的:

List<Summary> sortedSummaries = new List<Summary>(unsortedSummaries);  
sortedSummaries.OrderBy(x => x.FieldA).ThenBy(x => x.FieldB).ThenBy(x => x.FieldC).ThenBy(x => x.FieldD); 

但是,这使我得到了与使用关键字orderby的LINQ语句完全不同的结果。

我在这里可能会做错什么?


我想转换为使用链接的原因OrderBy/ThenBy扩展方法调用的是,我需要使用自定义比较上FieldD,就像这样:

.ThenBy(x => x.FieldD, new NaturalSortComparer()) 

我不能图中如何使用LINQ语句与orderby关键字,所以我认为使用扩展方法可能会让我更远,但由于我无法让我的扩展方法版本给我与我的orderby关键字版本相同的结果,我现在回到制图板。

任何想法?

回答

5

您的点符号调用不会将结果分配给任何东西。它应该是:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA) 
             .ThenBy(x => x.FieldB) 
             .ThenBy(x => x.FieldC) 
             .ThenBy(x => x.FieldD); 

不要忘了LINQ运营商永远不变的现有序列 - 他们返回一个序列与适当的差异(在这种情况下,排序)。如果您想在原地排序,请使用List<T>.Sort

上面的查询正是您原始代码的LINQ部分所做的。但是,如果我想从它构建一个清单,我不会把它传递给List<T>构造 - 我会用ToList扩展方法:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA) 
             .ThenBy(x => x.FieldB) 
             .ThenBy(x => x.FieldC) 
             .ThenBy(x => x.FieldD) 
             .ToList(); 

检查已经做了你指望它(它是什么真的应该) - 然后你可以把你的自定义比较。

+0

啊,是的,就是这样。现在完美。我以为我是LINQ运营商的会计师,从不改变现有的序列,但我必须混合起来:) – 2011-05-25 16:20:40