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

时间:2013-11-01 18:40:49

标签: c# linq

我有一个对象列表: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对对象列表进行排序?

5 个答案:

答案 0 :(得分:14)

一种可能的方法可能是:

list.Sort(new Comparison<FakeObject>((x, y) => 
    -DateTime.Compare(x.Date ?? DateTime.MaxValue,
        y.Date ?? DateTime.MaxValue)));
在OP编辑问题后,

更新修改为使用MaxDate进行说明。

请注意,您可以采用这种方式(MinDateMaxDate)。最重要的是,如果它是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将其整理得比其他任何东西低。