订单按日期收集,其中某些商品没有价值

时间:2010-07-05 16:39:43

标签: c# linq datetime sql-order-by

我有一个对象集合,我希望按DateTime属性排序?

  list.OrderBy(r => r.Milestone)

里程碑是:

  public DateTime? Milestone { get; set; }

它似乎将所有带有novalue的项目放在排序的顶部。无论如何都要按日期排序,但将空项放在列表的底部。 (我当然不关心空的排序)

所以,如果我有4个项目:

  1. 1/1/2001
  2. 1/1/2002
  3. [没有日期时间]
  4. 1/1/2004
  5. 我想订购清单1,2,4,3

2 个答案:

答案 0 :(得分:7)

一个简单的选择:

list.OrderBy(r => r.Milestone ?? DateTime.MaxValue)

值为DateTime.MaxValue的里程碑时,这将无法正常工作。

最近有一个相关的问题,关于实现IComparer<T>最后放置空值,但我现在找不到它......上面肯定是最简单的解决方案,如果你不使用其他任何内容MaxValue

可替换地:

list.OrderBy(r => !r.Milestone.HasValue)
    .ThenBy(r => r.Milestone)

将命令的所有值首先具有里程碑,然后排序不具有里程碑的值。这样,即使某些里程碑使用DateTime.MaxValue,它也会起作用。这对我的眼睛来说有点模糊,但你可能更喜欢它。

答案 1 :(得分:1)

试试这个:

list.OrderBy(r => r.Milestone.GetValueOrDefault(DateTime.Maxvalue))