使用连续 OrderBy() 而不是 ThenBy() 的区别

Difference between using consecutive OrderBy()'s instead of ThenBy()

提问人:Andreas 提问时间:11/10/2023 最后编辑:Andreas 更新时间:11/10/2023 访问量:75

问:

我很困惑为什么这两段代码会产生两种不同的结果。我希望第二个,使用 ThenBy() 生成正确的结果,但事实并非如此。第一个(我在调试过程中尝试过的东西)创建了正确的结果(但这似乎是巧合)。

我希望它像这样排序:

按属性“FileDate”按降序对所有内容进行排序。然后对事件类型的项目进行排序(使用 .IsEvent() 扩展名)按升序排列的“FileDate”。然后,按名称对其进行排序,以便按字母顺序对具有相同日期的项目进行排序。

var firstSort = nodeList.OrderByDescending(x => x.FileDate);
var secondSort = firstSort.OrderBy(x => x.IsEvent() ? x.FileDate : DateTime.MinValue);
var thirdSort = secondSort.OrderBy(x => x.Name);

thirdSort 中的结果是正确的结果。我期待的结果。但我认为这是一段糟糕的代码。

var sortedSet = nodeList.OrderByDescending(x => x.FileDate)
                .ThenBy(x => x.IsEvent() ? x.FileDate : DateTime.MinValue)
                .ThenBy(x => x.Name)
                .Skip(amountToSkip).Take(pageSize);

这不会产生我期望的结果。但我更喜欢这段代码。

有人可以ILI5为什么这些会产生不同的结果吗?以及我如何获得正确的结果,而不是使用连续的 OrderBy() 调用。

下面是一些示例数据、结果和预期结果:

格式:名称 (Type) (FileDate)

输入 (nodeList):

  • 激动人心的活动 (活动类型) (24-11-2023)
  • 其他活动 (事件类型) (16-11-2023)

结果:

  • 激动人心的活动 (活动类型) (24-11-2023)
  • 其他活动 (事件类型) (16-11-2023)

预期结果:

  • 其他活动 (事件类型) (16-11-2023)
  • 激动人心的活动 (活动类型) (24-11-2023)
C# .NET LINQ 排序 IEnumerable

评论

1赞 SomeBody 11/10/2023
如果不显示输入数据并告诉我们预期结果是什么,就很难回答这个问题。
0赞 Andreas 11/10/2023
Touché.我会看看我能收集到什么。
0赞 Svyatoslav Danyliv 11/10/2023
你期待什么结果?
0赞 Andreas 11/10/2023
我在问题中添加了一些示例数据。
0赞 Ralf 11/10/2023
如果结果如您所说,那么就已经足够了,您可以在此之前删除 OrderBy 子句。OrderBy 不会遵循列表的先前排序,它只会根据自己的规则对列表重新排序。您的示例没有帮助,因为它没有显示名称应该发生什么。OrderBy(x => x.Name)

答:

4赞 JonasH 11/10/2023 #1

ThenBy当主订单值相同时使用。首先按日期排序,如果日期相同,则按名称对这些值进行排序。

另一方面,OrderBy 只是做一个全新的排序,即使它是稳定的。

在您的示例中,不存在日期或名称相同的情况。因此,使用 OrderBy 的示例实际上将仅按名称排序。您的 ThenBy 示例将仅按日期降序排序。

所以结果完全符合预期,即使我不确定你真正想要什么结果。

例:

假设我有由成对的字母和数字组成的对象,比如说。我们首先用字母,然后用数字来表示我们会得到的。原因是我们生成了 的中间排序,然后进行了稳定的排序。a2, b2, a1, c1OrderBya1, c1, a2, b2a2, a1, b2, c1

使用 OrderBy 字母和 ThenBy 数字将产生 ,因为它只会在字母相同时使用数字进行排序。a1, a2, b2, c1