【问题标题】:Check if several booleans have the same value检查几个布尔值是否具有相同的值
【发布时间】:2012-07-01 01:57:04
【问题描述】:

我有三个布尔变量。我需要检查三个都是真的还是三个都是假的。

我可以用“假”的方式做到这一点:

bool areSame = false; 
if(a && b && c)    
    areSame = true; 
else if (!a && !b && !c)
    areSame = true;

我想知道是否还有其他更优雅的解决方案。

【问题讨论】:

    标签: c# boolean compare


    【解决方案1】:

    您也可以在布尔值上使用相等运算符:

    bool areSame = (a == b) && (a == c);
    

    【讨论】:

    • 既然可以输入按位操作数,为什么还要满足于可读代码呢? var areSame = !(a ^ b | b ^ c);:D
    • @ChrisSinclair:为了提高效率,我有时会进行按位运算(例如,乘以或除以 2 的幂),但我怀疑这里会有任何性能优势。
    • 是的,反正我只是在开玩笑。我不可能使用按位运算来进行这样的简单检查。如果只是检查所有值是否为true,那么我会说“去吧!”使用bool areSame = a & b & c & d & e,但所有false 选项有点像把活动扳手扔进去。
    【解决方案2】:

    当然,您在这里只是比较三个,但是未来呢?您可能需要在以后的某个地方比较十个布尔值。

        class Program
            {
                static void Main(string[] args)
                {
                    Console.WriteLine(false.AllEqual(false, false)); 
                    Console.WriteLine(true.AllEqual(false, false));
                    Console.WriteLine(true.AllEqual(true, false));
    
                    bool a = true;
                    bool b = false;
                    bool c = true;
                    Console.WriteLine(a.AllEqual(b, c));
                    b = true;
                    Console.WriteLine(a.AllEqual(b, c));
                    Console.ReadLine();
                } 
            }
    
            static class Extensions
        {
            static public  bool AllEqual(this bool firstValue, params bool[] bools)
            {
                return bools.All(thisBool => thisBool == firstValue);
            }
        }
    

    【讨论】:

    • 你是对的。答案真的很棒。但目前这不太可能是必要的。
    【解决方案3】:

    用这个怎么样?

    areSame = (a == b && b == c);
    

    【讨论】:

      【解决方案4】:

      怎么样:

      bool areSame = (a && b && c) || (!a && !b && !c) ? true : false;
      

      【讨论】:

      • 这玩意儿像 if(true == true),这是重言式。
      • 它可能有点冗长(我不确定 C# 语法),但它不是重言式——它是 if (true) then true else false,不是 if (true == true)跨度>
      • @anotherdave 你们都是对的。它是冗长的和重言式的。三元条件 vs 输出可以理解为相同。在 C# 中,条件必须始终为布尔值,因此 bool y = x ? true : false;var y = (bool)xbool y = x; 相同,因此 bool areSame = (a && b && c) || (!a && !b && !c) ? true : false; 在所有可能的解释中都与 bool areSame = (a && b && c) || (!a && !b && !c); 相同(即使考虑到运算符重载、短路和 @987654327 @ 类型转换)。 a == b == c; 是不那么冗长且更容易理解的替代方案。
      【解决方案5】:

      这种方法怎么样?它将允许您传入尽可能多的布尔值,并查看是否满足最小的真数。

      public static bool AreMinNumberOfTruesMet(int minNumOftrue, params bool[] bools)
      {
          var totalTrue = bools.Count(boolean => boolean == true);
      
          return totalTrue >= minNumOftrue;
      }
      

      【讨论】:

        【解决方案6】:

        或者在一行中:

        bool allSame = !bools.Any(b => b != bools[0])
        

        【讨论】:

          【解决方案7】:
          //all same
          bool allSame = a == b == c == d;
          
          //all false
          bool allFalse = a == b == c == d == false;
          

          【讨论】:

          • 虽然这段代码可能会解决问题,但好的答案也应该包含解释。
          • 这个答案不正确。这个断言失败:bool allSame = true == false == false == true; Debug.Assert(!allSame);truefalsefalsetrue这四个布尔值不一样,所以断言!allSame应该成功。
          猜你喜欢
          • 2018-08-18
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          • 2021-07-11
          • 2013-09-02
          相关资源
          最近更新 更多