使用LINQ orderby关键字与OrderBy扩展方法进行等效排序

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关键字版本相同的结果,我现在回到绘图板.

有任何想法吗?

Jon*_*eet 5

点符号调用不会将结果分配给任何内容.它应该是:

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)

检查那是否符合您的预期(它确实应该) - 然后您可以将自定义比较放入其中.