C#中含null的可空DateTime列表如何按日期升序、null值排末尾
C# 可空DateTime列表排序实现(null值排末尾)
原有写法的问题
- 第一种默认
a.CompareTo(b)写法:C# 可空值类型的默认比较逻辑会将null视为小于任何非null值,排序后所有null会出现在列表最前,不符合要求 - 第二种只比较
HasValue的写法:仅判断了是否有值,完全没有对日期本身做对比,无法实现日期升序效果
可行实现方案
方法1:使用LINQ方法(写法最简洁)
直接通过两次排序实现,先把非null值排到前面,再对非null值按日期升序,最终生成新的排序后列表:
var sortedList = allDateTimes .OrderBy(d => d.HasValue ? 0 : 1) .ThenBy(d => d) .ToList();
注:如果需要直接修改原列表,而不是生成新列表,可以使用第二种方法。
方法2:使用List.Sort自定义比较器(直接修改原列表)
自定义比较逻辑,明确处理null的排序优先级:
allDateTimes.Sort((a, b) => { // 两者都为null,视为相等 if (!a.HasValue && !b.HasValue) return 0; // a为null,b不为null,a排在后面,返回1 if (!a.HasValue) return 1; // b为null,a不为null,a排在前面,返回-1 if (!b.HasValue) return -1; // 都有值时按日期升序比较 return a.Value.CompareTo(b.Value); });
补充注意:你示例代码里的
Null为笔误,C# 中可空类型的空值标识为小写的null。
内容的提问来源于stack exchange,提问作者Adam Lundberg
相关产品推荐
相关产品推荐

