从datetime集合中获取不同的非日期日期

时间:2015-04-03 13:57:10

标签: c# .net linq collections lambda

我有一组这样的日期时间:

IEnumerable<DateTime?> dates

我希望通过降序

来收集不同的日期排序
   IEnumerable<DateTime> dtCollection = dates.Where(x => x.HasValue).Distinct().OrderByDescending(x => x).AsEnumerable();

在上面的代码中,我得到了无效强制转换的异常,并且distinct返回distinct(日期+时间)而不是不同的日期。

所以:

  1. 为什么Where(x => x.HasValue)没有丢弃所有空值
  2. 如何修复代码以完成任务?
  3. 谢谢,

2 个答案:

答案 0 :(得分:1)

在查询中,通过选择值来将DateTime?个对象转换为DateTime

IEnumerable<DateTime> dtCollection = dates
    .Where(x => x.HasValue)
    .Select(x => x.Value)
    .Distinct()
    .OrderByDescending(x => x)
    .AsEnumerable();

由于Where()子句仅过滤那些具有值的子句,因此Select()子句应该成功而不会出错。那个Select()的输出是DateTime而不是DateTime?的集合。

相反,要仅选择DateTime的一个属性,请更新该子句:

.Select(x => x.Value.Date)

答案 1 :(得分:1)

您可以使用.Date来获取DateTime的日期组件:

dates
    .Where(x => x.HasValue)
    .Select(x => x.Value.Date)
    .Distinct()
    .OrderByDescending(x => x)

在回答您的第一点时,Where(x => x.HasValue) 会丢弃您所期望的所有空值,但您仍然会留下{{{{ 1}}而不是DateTime?,当您尝试将其分配给DateTime时导致类型转换错误,因此您需要使用IEnumerable<DateTime> dtCollection将每个x.Value转换为DateTime?