我有一个对象列表:List<FakeObject> list = ...
每个对象都有一个DateTime属性,我们称之为“Date”
我想按此日期属性按降序对此列表进行排序。但是,当我尝试
时 list.Sort(new Comparison<FakeObject>((x, y) => DateTime.Compare(x.Date, y.Date)))
它抱怨,因为Date属性可以为空。
如何对此列表进行排序,将可空日期视为MAX DATE,将其显示在顶部?对我来说,快速简单的替代方法是不要使Date字段可以为空,但让我们假设现在不是一个选项。
简而言之:如果DateTime可以为null,我如何按DateTime对对象列表进行排序?
答案 0 :(得分:14)
一种可能的方法可能是:
list.Sort(new Comparison<FakeObject>((x, y) =>
-DateTime.Compare(x.Date ?? DateTime.MaxValue,
y.Date ?? DateTime.MaxValue)));
在OP编辑问题后, 更新修改为使用MaxDate
进行说明。
请注意,您可以采用这种方式(MinDate
或MaxDate
)。最重要的是,如果它是null
,那么给它一些静态值来完成你想要的东西。
答案 1 :(得分:6)
如果要将所有空日期转换为最大日期值,请在函数中执行此操作。您可以使用null coalesce运算符来获得更简洁的语法:
list.Sort((x, y) =>
DateTime.Compare(x.Date ?? DateTime.MaxValue, y.Date ?? DateTime.MaxValue))
答案 2 :(得分:4)
如果您可以替换列表,而不是就地修改它,则可以使用LINQ。
list = list.OrderByDescending(x => x.Date ?? DateTime.MaxValue).ToList();
答案 3 :(得分:0)
如何在比较之前将空日期实例设置为MAX?
list.ForEach(x => x.Date = x.Date ?? null : DateTime.Max : x.Date);
...然后调用你的比较..
答案 4 :(得分:0)
我会做这样的事情。
首先,给出一个像这样的课程
class Widget
{
public DateTime? DateCreated { get ; set ; }
}
我会写一个自定义比较器,如下所示:
class Widget
{
public DateTime? DateCreated { get ; set ; }
}
class WidgetComparer : IComparer<Widget> , IComparer<DateTime?>
{
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
将其整理得比其他任何东西低。