C#:按可以为空的DateTime属性排序对象列表

我有一个对象List list = ...List list = ...

每个对象都有一个DateTime属性,我们称之为“Date”

我想按此日期属性按降序对此列表进行排序。 但是,当我尝试

list.Sort(new Comparison((x, y) => DateTime.Compare(x.Date, y.Date)))

它抱怨,因为Date属性可以为空。

如何对此列表进行排序,将可空日期视为MAX DATE,将其显示在顶部? 对我来说,快速简单的替代方法是不要使Date字段可以为空,但让我们假设现在不是一个选项。

简而言之:如果DateTime可以为null,我如何按DateTime对对象列表进行排序?

一种可能的方法可能是:

 list.Sort(new Comparison((x, y) => -DateTime.Compare(x.Date ?? DateTime.MaxValue, y.Date ?? DateTime.MaxValue))); 

更新:在OP编辑问题后进行修改以使用MaxDate进行说明。

请注意,您可以采用这种方式( MinDateMaxDate )。 底线是这个,如果它是null那么给它一些静态值来完成你想要的。

如果要将所有空日期转换为最大日期值,请在函数中执行此操作。 您可以使用null coalesce运算符为此更简洁的语法:

 list.Sort((x, y) => DateTime.Compare(x.Date ?? DateTime.MaxValue, y.Date ?? DateTime.MaxValue)) 

如果您可以替换列表,而不是就地修改它,则可以使用LINQ。

 list = list.OrderByDescending(x => x.Date ?? DateTime.MaxValue).ToList(); 

如何在比较之前将空日期实例设置为MAX?

 list.ForEach(x => x.Date = x.Date ?? null : DateTime.Max : x.Date); 

…然后是你的比较号召……

我会做这样的事情。

首先,给出这样的课程

 class Widget { public DateTime? DateCreated { get ; set ; } } 

我会写一个自定义比较器,如下所示:

 class Widget { public DateTime? DateCreated { get ; set ; } } class WidgetComparer : IComparer , IComparer { public bool NullCollatesHigh { get ; private set ; } private WidgetComparer( bool nullCollatesHigh ) { this.NullCollatesHigh = nullCollatesHigh ; return ; } public int Compare( Widget x , Widget y ) { int cc ; if ( x == null && y == null ) cc = 0 ; else if ( x != null && y != null ) cc = Compare( x.DateCreated , y.DateCreated ) ; else if ( NullCollatesHigh ) cc = x == null ? +1 : -1 ; else cc = x == null ? -1 : +1 ; return cc ; } public int Compare(DateTime? x, DateTime? y) { int cc ; if ( x == null && y == null ) cc = 0 ; else if ( x != null && y != null ) cc = DateTime.Compare( x.Value , y.Value ) ; else if ( NullCollatesHigh ) cc = x == null ? +1 : -1 ; else cc = x == null ? -1 : +1 ; return cc ; } } 

然后这是一个简单的问题

 widgetList.Sort( new WidgetComparer( true/false ) ) ; 

其中true指定整理高于其他任何值的空值而false指定整理它们低于其他任何值。