【问题标题】:Linq, Lambda and nullable DateTime combination questionLinq、Lambda 和可为空的 DateTime 组合问题
【发布时间】:2011-04-16 20:33:17
【问题描述】:

我有一个 Schedule 课程:

public class Schedule
{

 .....

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

 ....

}

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


注意:这里的空日期值意味着无穷大。但是,未指定的计划周期(空的开始和结束日期)意味着计划没有开始..

【问题讨论】:

  • “最佳方式”是什么意思?
  • 一个语句少处理就完美了..
  • @Akram Shahda:嗯,对不起,我不清楚你能举个数字例子吗?
  • 我提出的解决方案当然可以合并到一个语句中。但我更喜欢可读的解决方案。 ;-)
  • 放轻松,伙计们..如果我知道最佳解决方案是怎样的,我不会要求它..

标签: c# linq lambda


【解决方案1】:
schedules.Where(s => s.StartDate < DateTime.Now
                     || (s.StartDate == null && s.EndDate != null));

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

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

【讨论】:

    【解决方案2】:
    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;
    

    【讨论】:

    • 首先,您错过了未指定的计划周期约束。你犯了一个错误,将最大 DateTime 值分配给 StartDate,将最小 DateTime 值分配给 EndDate。但是,我从这段代码中学到了一些东西。所以,谢谢。
    【解决方案3】:
    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);
    

    【讨论】:

    • 这段代码没有意义,它总是错误的,因为你可以将它重写为(StartDate != null &amp;&amp; StartDate == null) || (StartDate &gt; Now &amp;&amp; StartDate &lt; Now)
    • 我刚刚修好了。布尔表达式的第二部分当然应该与 EndDate 进行比较。
    • @Akram,虽然这段代码是错误的,但它不应该产生异常。你得到什么例外?
    • 为什么会产生异常?
    • @Achim @svick:如果 StartDate 为空, schedule.StartDate > DateTime.Now 将生成我正在谈论的异常。
    猜你喜欢
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多