比较日期为空时的日期
本文关键字:日期 比较 | 更新日期: 2023-09-27 18:27:34
我正在尝试获取StartDate
和EndDate
之间的Linq查询中的所有日期。我的StartDate
和EndDate
都是正确的日期,但我的结果不一致。查询中的其他所有内容都有效,只是日期比较无效。我做错了什么?
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
位于startDate
和endDate
之间的所有实例(并且startDate
或endDate
可以为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)
请问startDate
、endDate
、object
或DateTime?
(即Nullable<DateTime>
)的声明C#类型(编译时类型)是什么。如果它们是Nullable<>
,如果你敢,你可以使用否定和提升运算符,并将其转换为:
where !(o.FirstAirDate <= startDate) && !(endDate <= o.FirstAirDate)
请注意,此处包含null
检查。如果<=
的操作数是null
,则结果是false
,并且由于取反,因此它将在null
的情况下工作。