Rob*_*Rob 2 c# sorting linq-to-objects .net-3.5
我试图提出一组链接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);
Run Code Online (Sandbox Code Playgroud)
现在,我猜想使用链式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);
Run Code Online (Sandbox Code Playgroud)
但是,与使用orderby
关键字的LINQ语句相比,这给出了完全不同的结果.
我在这里做错了什么?
我试图转换为使用链式OrderBy
/ ThenBy
扩展方法调用的原因是我需要使用自定义比较器FieldD
,如下所示:
.ThenBy(x => x.FieldD, new NaturalSortComparer())
Run Code Online (Sandbox Code Playgroud)
我无法orderby
想象如何使用关键字的LINQ语句来做到这一点,所以我认为使用扩展方法可能会让我更远,但因为我无法获得我的扩展方法版本给我与我的orderby
关键字版本相同的结果,我现在回到绘图板.
有任何想法吗?
点符号调用不会将结果分配给任何内容.它应该是:
var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
.ThenBy(x => x.FieldB)
.ThenBy(x => x.FieldC)
.ThenBy(x => x.FieldD);
Run Code Online (Sandbox Code Playgroud)
不要忘记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();
Run Code Online (Sandbox Code Playgroud)
检查那是否符合您的预期(它确实应该) - 然后您可以将自定义比较放入其中.
归档时间: |
|
查看次数: |
1416 次 |
最近记录: |