【发布时间】:2012-07-01 01:57:04
【问题描述】:
我有三个布尔变量。我需要检查三个都是真的还是三个都是假的。
我可以用“假”的方式做到这一点:
bool areSame = false;
if(a && b && c)
areSame = true;
else if (!a && !b && !c)
areSame = true;
我想知道是否还有其他更优雅的解决方案。
【问题讨论】:
我有三个布尔变量。我需要检查三个都是真的还是三个都是假的。
我可以用“假”的方式做到这一点:
bool areSame = false;
if(a && b && c)
areSame = true;
else if (!a && !b && !c)
areSame = true;
我想知道是否还有其他更优雅的解决方案。
【问题讨论】:
您也可以在布尔值上使用相等运算符:
bool areSame = (a == b) && (a == c);
【讨论】:
var areSame = !(a ^ b | b ^ c);:D
true,那么我会说“去吧!”使用bool areSame = a & b & c & d & e,但所有false 选项有点像把活动扳手扔进去。
当然,您在这里只是比较三个,但是未来呢?您可能需要在以后的某个地方比较十个布尔值。
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);
}
}
【讨论】:
用这个怎么样?
areSame = (a == b && b == c);
【讨论】:
怎么样:
bool areSame = (a && b && c) || (!a && !b && !c) ? true : false;
【讨论】:
bool y = x ? true : false; 与 var y = (bool)x 和 bool y = x; 相同,因此 bool areSame = (a && b && c) || (!a && !b && !c) ? true : false; 在所有可能的解释中都与 bool areSame = (a && b && c) || (!a && !b && !c); 相同(即使考虑到运算符重载、短路和 @987654327 @ 类型转换)。 a == b == c; 是不那么冗长且更容易理解的替代方案。
这种方法怎么样?它将允许您传入尽可能多的布尔值,并查看是否满足最小的真数。
public static bool AreMinNumberOfTruesMet(int minNumOftrue, params bool[] bools)
{
var totalTrue = bools.Count(boolean => boolean == true);
return totalTrue >= minNumOftrue;
}
【讨论】:
或者在一行中:
bool allSame = !bools.Any(b => b != bools[0])
【讨论】:
//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);true、false、false和true这四个布尔值不一样,所以断言!allSame应该成功。