在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

在c#中是否有更好的方法来编写布尔值计算

嗯,

// 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#参考).