在c#中是否有更好的方法来编写布尔值计算
本文关键字:布尔值 计算 方法 是否 更好 | 更新日期: 2023-09-27 17:49:21
这看起来真的很尴尬…有人有什么更简洁的方法吗?
bool case1 = (dte.StartDateTime >= Date) && (dte.StartDateTime < Date.AddHours(_interval));
bool case2 = (dte.EndDateTime > Date) && (dte.EndDateTime < Date.AddHours(_interval));
bool case3 = (dte.StartDateTime <= Date) && (dte.EndDateTime >= Date.AddHours(_interval));
return ((dte.Association == Association) && (case1 | case2 | case3));
c#, .net 2.0
嗯,
// this seems to rule out everything
if(dte.Association != Association) return false;
// find end
var endInterval = Date.AddHours(_interval);
return ((dte.StartDateTime >= Date) && (dte.StartDateTime < endInterval))
|| ((dte.EndDateTime > Date) && (dte.EndDateTime < endInterval))
|| ((dte.StartDateTime <= Date) && (dte.EndDateTime >= endInterval));
这样就短路了,我们只找到一次结束日期。
一个想法是通过将这些布尔赋值移动到它自己的方法中,然后根据它正在做的事情准确地命名方法,以及为布尔值提供描述性名称,使您的代码更具自文档性。但老实说,你看到的并不坏
写一个助手方法InRange,它允许你写:
bool case1 = DateTimeHelpers.InRange(dte.StartDate, Date, Date.AddHours(_interval));
也许这不是更好,但更短:
DateTime end = Date.AddHours(_interval);
return dte.Association == Association
&& (dte.StartDateTime >= Date && dte.StartDateTime < end
|| dte.EndDateTime > Date && dte.EndDateTime < end
|| dte.StartDateTime <= Date && dte.EndDateTime >= end);
注意,大多数时候你应该使用||
而不是|
,因为||
更快。
更重要的一件事是你注释了这段代码,这样别人就能真正理解代码在做什么了
你可以这样写
return (
dte.Association == Association
&& ((dte.StartDateTime >= Date && dte.StartDateTime < Date.AddHours(_interval))
|| (dte.EndDateTime > Date && dte.EndDateTime < Date.AddHours(_interval))
|| (dte.StartDateTime <= Date && dte.EndDateTime >= Date.AddHours(_interval))
)
);
顺便说一下-如果我没记错的话- &&
操作符与&
不同,第一个操作符在条件失败时失败,并且不检查其他条件,而第二个操作符评估所有条件,但我需要检查这个。
是的,就是那样,看&&操作符(c#参考).