LINQ orderby关键字与OrderBy扩展方法的等效排序

问题描述

|| 我正在尝试提出一组链接的
OrderBy
/
ThenBy
扩展方法调用,这些方法等效于使用
orderby
关键字的LINQ语句。 我的使用
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);
但是,与使用results2ѭ关键字使用LINQ语句相比,这给我带来了截然不同的结果。 我在这里可能做错了什么? 我尝试转换为使用链接的
OrderBy
/
ThenBy
扩展方法调用的原因是,我需要在
FieldD
上使用自定义比较器,如下所示:
.ThenBy(x => x.FieldD,new NaturalSortComparer())
我无法弄清楚如何使用带有
orderby
关键字的LINQ语句来执行此操作,因此我认为使用扩展方法可能会使我走得更远,但是由于我无法获得扩展方法版本来提供与以下结果相同的结果我的
orderby
关键字版本,暂时回到了画板。 有任何想法吗?     

解决方法

点表示法调用不会将结果分配给任何对象。应该是:
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();
检查该功能是否符合您的预期(它确实应该如此)-然后可以放入自定义比较。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...