在C#中有更好的方法来编写这个布尔评估

时间:2011-04-08 14:24:57

标签: c#

这看起来真的很尴尬......有人建议采取更清洁的做法吗?

  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

5 个答案:

答案 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);

请注意,您应该多次使用||而不是|,因为||更快。

更重要的一点是你评论这段代码,所以实际上有人可以理解代码的有效性。