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

Hen*_*hiu 6 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对对象列表进行排序?

Mik*_*oud 14

一种可能的方法可能是:

list.Sort(new Comparison<FakeObject>((x, y) => 
    -DateTime.Compare(x.Date ?? DateTime.MaxValue,
        y.Date ?? DateTime.MaxValue)));
Run Code Online (Sandbox Code Playgroud)

更新:修改MaxDate后使用OP编辑问题进行澄清.

请注意,您可以这样做(MinDateMaxDate).最重要的是,如果它null然后给它一些静态值,以实现你想要的.


Ser*_*rvy 6

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

list.Sort((x, y) => 
    DateTime.Compare(x.Date ?? DateTime.MaxValue, y.Date ?? DateTime.MaxValue))
Run Code Online (Sandbox Code Playgroud)


Tim*_* S. 5

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

list = list.OrderByDescending(x => x.Date ?? DateTime.MaxValue).ToList();
Run Code Online (Sandbox Code Playgroud)