我正在尝试提出一组链式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);
但是,与使用orderby
关键字的LINQ语句相比,这给出了完全不同的结果。
我可能在这里做错了什么?
我尝试转换为使用链式OrderBy
/ ThenBy
扩展方法调用的原因是我需要在FieldD
上使用自定义比较器,如下所示:
.ThenBy(x => x.FieldD, new NaturalSortComparer())
我无法想象如何使用带有orderby
关键字的LINQ语句来做到这一点,所以我认为使用扩展方法可能会让我更远,但是因为我无法获得我的扩展方法版本我和我的orderby
关键字版本的结果相同,我现在回到绘图板。
有什么想法吗?
答案 0 :(得分:5)
您的点符号调用不会将结果分配给任何内容。它应该是:
var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
.ThenBy(x => x.FieldB)
.ThenBy(x => x.FieldC)
.ThenBy(x => x.FieldD);
不要忘记LINQ运算符永远不会更改现有的序列 - 它们返回具有适当差异的 new 序列(在本例中为排序)。如果要进行就地排序,请使用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();
检查它是否符合您的预期(它确实应该) - 然后您可以自定义比较。