Linq、Lambda和可为null的DateTime组合问题

本文关键字:DateTime 组合 问题 null Lambda Linq | 更新日期: 2023-09-27 17:50:16

我有一个Schedule类:

public class Schedule
{
 .....
 public DateTime? StartDate{get;set;}
 public DateTime? EndDate{get;set;}
 ....
}

我想使用linqlambda以最佳方式从IEnumerable列表中获取已启动的Schedule对象的列表。


注意:此处的空日期值表示无穷大。但是,未指定的计划周期(空的开始和结束日期(意味着计划未开始。。

Linq、Lambda和可为null的DateTime组合问题

schedules.Where(s => s.StartDate < DateTime.Now
                     || (s.StartDate == null && s.EndDate != null));

这假设你真的想要你所说的——所有开始的时间表,包括那些已经结束的时间表。

此外,您可能希望更改表示未指定计划周期的方式,可能为此添加bool。如果null表示无穷大,那么它应该始终表示无穷大。

var started =
    from s in schedules
    let startDate = s.StartDate ?? DateTime.MaxValue
    let endDate = s.EndDate ?? DateTime.MinValue
    where startDate <= DateTime.Now
    && endDate > DateTime.Now
    select s;
bool IsStarted(Schedule schedule) {
   // Assuming that ended schedules should be excluded
   return schedule.StartDate != null && schedule.StartDate > DateTime.Now
       && (schedule.EndDate==null || schedule.EndDate < Datetime.Now);
}
items.Where(IsStarted);

如果可能的话,将IsStarted作为Schedule类的属性并不是最糟糕的主意。在这种情况下,您必须使用:

items.Where(i => i.IsStarted);