c# – 优雅地确定是否有多个布尔值为“true”

我有一组五个布尔值。如果一个以上的这些是真的,我想优秀一个特定的功能。什么是最优雅的方式,你可以想到,这将允许我检查这个条件在一个单一的if()语句?目标语言是C#,但我对其他语言的解决方案感兴趣(只要我们不在谈论特定的内置函数)。

一个有趣的选择是将布尔值存储在一个字节中,执行右移并与原始字节进行比较。像if(myByte>> 1))但是这将需要将单独的布尔转换为一个字节(通过bitArray?),似乎有点(双关语)笨拙… [edit ]对不起,应该是if(myByte&(myByte – 1))[/ edit]

注意:这当然非常接近经典的“人口计数”,“横向加法”或“汉明重量”编程问题 – 但不完全相同。我不需要知道有多少位被设置,只有当它是多个。我的希望是有一个更简单的方法来完成这一点。

怎么样

  if ((bool1? 1:0) + (bool2? 1:0) + (bool3? 1:0) + 
      (bool4? 1:0) + (bool5? 1:0) > 1)
      // do something

或一般的方法将…

   public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
    {
       int trueCnt = 0;
       foreach(bool b in bools)
          if (b && (++trueCnt > threshold)) 
              return true;
       return false;          
    } 

或使用LINQ如其他答案建议:

    public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
    { return bools.Count(b => b) > threshold; }

编辑(添加Joel Coehoorn建议:
(在.Net 2.x和更高版本中)

    public void ExceedsThreshold<T>(int threshold, 
                      Action<T> action, T parameter, 
                      IEnumerable<bool> bools)
    { if (ExceedsThreshold(threshold, bools)) action(parameter); }

或.Net 3.5及更高版本:

    public void ExceedsThreshold(int threshold, 
            Action action, IEnumerable<bool> bools)
    { if (ExceedsThreshold(threshold, bools)) action(); }

或作为IEnumerable< bool>

  public static class IEnumerableExtensions
  {
      public static bool ExceedsThreshold<T> 
         (this IEnumerable<bool> bools, int threshold)
      { return bools.Count(b => b) > threshold; }
  }

用法将是:

  var bools = new [] {true, true, false, false, false, false, true};
  if (bools.ExceedsThreshold(3))
      // code to execute  ...
http://stackoverflow.com/questions/377990/elegantly-determine-if-more-than-one-boolean-is-true

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 优雅地确定是否有多个布尔值为“true”