C# LINQ实现日期降序同日期时间降序排序问题求解
问题根因
当前代码日期排序逻辑正确,但同日期下的时间排序调用的是ThenBy()方法,该方法执行的是升序排列,和要求的时间降序规则相反,因此同日期条目会按时间从早到晚排序,不符合预期。
修复方案
最小改动修正原有逻辑
只需要把时间排序的方法从升序的ThenBy替换为降序的ThenByDescending即可:
List<some> orderedData = data .OrderByDescending(c => c.ModifiedOn.Date) .ThenByDescending(c => c.ModifiedOn.TimeOfDay) .ToList();
更简洁的优化写法
DateTime类型原生支持完整的时间先后比较,比较时默认先判断日期部分、日期相同再判断时间部分,因此不需要手动拆分日期和时间字段,直接对整个ModifiedOn字段做降序排序就能实现完全一致的效果,代码更简洁、执行效率也更高:
List<some> orderedData = data .OrderByDescending(c => c.ModifiedOn) .ToList();
补充说明:如果
ModifiedOn是可空的DateTime?类型,可根据空值排序需求补默认值,比如需要把空时间条目排到最后,可以写成c => c.ModifiedOn ?? DateTime.MinValue。
用上述代码排序后,输出顺序符合日期、时间双降序的要求,和样例输入对应的正确排序结果完全匹配:
11/19/2021 9:04:39 PM 11/19/2021 8:54:39 PM 11/18/2021 10:29:39 PM 11/18/2021 8:44:39 PM 11/17/2021 8:26:39 PM
(注:你给出的预期输出中最后两条时间数值和输入不一致,属于笔误,排序逻辑本身符合需求规则)
内容的提问来源于stack exchange,提问作者devPie
相关产品推荐
相关产品推荐

