我有以下内容:
new ObservableCollection<SomeData>(SomeDataCollection.Where(a => a.AGD_Category.Equals((int)AGD_CategoryEnum.Med) && ((a.AGG_DateStart.Date <= SelectedUntill) && (a.AGG_DateEnd.Value.Date >= SelectedFrom))));
现在我的a.AGG_DateEnd是一个可以为空的日期时间,只要列表中有空值,我就会得到一个例外,因为&#34; a.AGG_DateEnd.Value.Date&#34;一部分。
但问题是,a.AGG_DateEnd还包含小时和分钟,但我不希望这导致我的比较产生不可靠的结果。
我可以做些什么来改进?
谢谢,
答案 0 :(得分:13)
快速破解是:
a.AGG_DateEnd.GetValueOrDefault().Date >= SelectedFrom
这没关系,因为default(DateTime)
(等于其自己的.Date
)不大于任何(其他)DateTime
值。
否则通常要做的事情是:
a.AGG_DateEnd.HasValue && a.AGG_DateEnd.Value.Date >= SelectedFrom
其中双&
确保快捷评估。
评论后补充:
如果您希望在null
的情况下得到相反的答案,那就是:
(a.AGG_DateEnd ?? DateTime.MaxValue).Date >= SelectedFrom
分别为:
!a.AGG_DateEnd.HasValue || a.AGG_DateEnd.Value.Date >= SelectedFrom
稍后修改:自C#6。0(2015年7月)以来,您可以使用?.
运算符。所以使用更短的代码:
a.AGG_DateEnd?.Date >= SelectedFrom
将(正式地,至少)比较类型DateTime?
的两个可空值。当任一操作数为“null”时(即.HasValue
给出false
),这样的比较会给出false
。
如果你想要null的相反bool结果,那就是:
!(a.AGG_DateEnd?.Date < SelectedFrom)
当我们使用运行x >= y
值的提升运算符时,请观察!(x < y)
与Nullable<>
的不同之处。如果>=
和<
中的一个为空,则任何提升的运算符(如false
或x
)都会立即返回y
;仅当x
和y
都为非空时,它们才会被解包,并且内容会与将使用其返回值的非提升运算符进行比较。