这看起来真的很尴尬......有人建议采取更清洁的做法吗?
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
答案 0 :(得分:2)
一个想法是通过将这些布尔分配中的每一个移动到它自己的方法中,然后将方法命名为它正在做的事情,以及为布尔值赋予描述性名称,从而使代码更加自我记录。但老实说,你所拥有的并不坏
答案 1 :(得分:2)
编写一个帮助方法,InRange,允许你写:
bool case1 = DateTimeHelpers.InRange(dte.StartDate, Date, Date.AddHours(_interval));
答案 2 :(得分:2)
那么,
// 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));
然后将其短路,我们只找到结束日期一次。
答案 3 :(得分:1)
您可以像
一样编写它们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))
)
);
顺便说一句 - 如果我没记错的话 - &&
运算符与&
不同,第一个运算符会在条件失败时失败并且不检查其他条件,而第二个运算符一个人评估他们,但我需要检查一下。
<强>更新强>
是的,就是这样,请参阅&& Operator (C# Reference)。
答案 4 :(得分:1)
也许这不是更好,但更短:
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);
请注意,您应该多次使用||
而不是|
,因为||
更快。
更重要的一点是你评论这段代码,所以实际上有人可以理解代码的有效性。