提问人:Andreas 提问时间:11/10/2023 最后编辑:Andreas 更新时间:11/10/2023 访问量:75
使用连续 OrderBy() 而不是 ThenBy() 的区别
Difference between using consecutive OrderBy()'s instead of ThenBy()
问:
我很困惑为什么这两段代码会产生两种不同的结果。我希望第二个,使用 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)
答:
ThenBy
当主订单值相同时使用。首先按日期排序,如果日期相同,则按名称对这些值进行排序。
另一方面,OrderBy 只是做一个全新的排序,即使它是稳定的。
在您的示例中,不存在日期或名称相同的情况。因此,使用 OrderBy 的示例实际上将仅按名称排序。您的 ThenBy 示例将仅按日期降序排序。
所以结果完全符合预期,即使我不确定你真正想要什么结果。
例:
假设我有由成对的字母和数字组成的对象,比如说。我们首先用字母,然后用数字来表示我们会得到的。原因是我们生成了 的中间排序,然后进行了稳定的排序。a2, b2, a1, c1
OrderBy
a1, c1, a2, b2
a2, a1, b2, c1
使用 OrderBy 字母和 ThenBy 数字将产生 ,因为它只会在字母相同时使用数字进行排序。a1, a2, b2, c1
评论
OrderBy(x => x.Name)