比较日期为空时的日期

本文关键字:日期 比较 | 更新日期: 2023-09-27 18:27:34

我正在尝试获取StartDateEndDate之间的Linq查询中的所有日期。我的StartDateEndDate都是正确的日期,但我的结果不一致。查询中的其他所有内容都有效,只是日期比较无效。我做错了什么?

where (startDate == null || DateTime.Compare((DateTime)startDate,
o.FirstAirDate) < 0) && (endDate == null|| DateTime.Compare(
o.FirstAirDate, (DateTime)endDate) > 0)

日期显示在范围之外,当我将日期移得更近时,不会显示任何内容。例如,如果我搜索12月21日至26日,我会得到这两个日期之间的结果,但也会显示27日的日期。如果我从12月23日至26日搜索,则没有显示任何内容,即使我在12月21日至26日间搜索时看到了该范围内的日期。

比较日期为空时的日期

如果您试图获取FirstAirDate位于startDateendDate之间的所有实例(并且startDateendDate可以为null),并且它们都是DateTime对象,则您可能希望尝试以下操作:

var objects = MyObjectsList.Where(o => 
     (!startDate.HasValue || o.FirstAirDate >= startDate.Value) 
  && (!endDate.HasValue || o.FirstAirDate <= endDate.Value))

您可以使用简单的比较运算符来比较日期,只需在进行比较时对可为null的DateTime属性使用.Value即可,在这种情况下,最好先进行null检查。

您的最后一个不等式:

DateTime.Compare(o.FirstAirDate, (DateTime)endDate) > 0

是错误的方式。与第一个看起来正确的不等式相比,您可以将两个参数切换为Compare< 0更改为> 0。但你两者都做,这会相互抵消。

简单地直接使用DateTime值之间的比较更容易,例如:

where (startDate == null || (DateTime)startDate < o.FirstAirDate)
  && (endDate == null || o.FirstAirDate < (DateTime)endDate)

请问startDateendDateobjectDateTime?(即Nullable<DateTime>)的声明C#类型(编译时类型)是什么。如果它们是Nullable<>,如果你敢,你可以使用否定和提升运算符,并将其转换为:

where !(o.FirstAirDate <= startDate) && !(endDate <= o.FirstAirDate)

请注意,此处包含null检查。如果<=的操作数是null,则结果是false,并且由于取反,因此它将在null的情况下工作。