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

时间:2011-05-25 16:09:55

标签: 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);

现在,我猜想使用链式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关键字版本的结果相同,我现在回到绘图板。

有什么想法吗?

1 个答案:

答案 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();

检查它是否符合您的预期(它确实应该) - 然后您可以自定义比较。