【问题标题】:Equivalent sorting with LINQ orderby keyword vs. OrderBy extension method使用 LINQ orderby 关键字与 OrderBy 扩展方法进行等效排序
【发布时间】:2011-09-01 22:05:19
【问题描述】:

我正在尝试提出一组链式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 关键字版本相同的结果,我暂时回到绘图板。

有什么想法吗?

【问题讨论】:

    标签: c# sorting linq-to-objects .net-3.5


    【解决方案1】:

    您的点符号调用没有将结果分配给任何东西。应该是:

    var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
                                           .ThenBy(x => x.FieldB)
                                           .ThenBy(x => x.FieldC)
                                           .ThenBy(x => x.FieldD);
    

    不要忘记 LINQ 运算符永远不会更改 现有 序列 - 它们返回具有适当差异(在本例中为排序)的 序列。如果要就地排序,请使用List&lt;T&gt;.Sort

    上面的查询正是原始代码的 LINQ 部分所做的。但是,如果我想从中构造一个列表,我不会将它传递给 List&lt;T&gt; 构造函数 - 我会使用 ToList 扩展方法:

    var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
                                           .ThenBy(x => x.FieldB)
                                           .ThenBy(x => x.FieldC)
                                           .ThenBy(x => x.FieldD)
                                           .ToList();
    

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

    【讨论】:

    • 啊,是的,就是这样。现在完全有道理。我以为我在考虑 LINQ 运算符从不改变现有序列,但我一定搞混了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多