Linq,Lambda和可以为空的DateTime组合问题

时间:2011-04-16 12:09:30

标签: c# linq lambda

我有一个Schedule类:

public class Schedule
{

 .....

 public DateTime? StartDate{get;set;}
 public DateTime? EndDate{get;set;}

 ....

}

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


注意:空白日期值表示此处为无穷大。但是,未指定的计划期间(空的开始和结束日期)表示计划未开始..

3 个答案:

答案 0 :(得分:0)

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);

答案 1 :(得分:0)

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;

答案 2 :(得分:0)

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

这假设您实际上想要您所说的内容 - 所有已开始的时间表,包括那些已经结束的时间表。

此外,您可能希望更改表示未指定的计划期间的方式,可能需要为此添加bool。如果null表示无穷大,则应始终表示无穷大。

相关问题