C# 用逻辑运算符确定差异
我有这行代码C# 用逻辑运算符确定差异,c#,boolean,logic,C#,Boolean,Logic,我有这行代码 bool b1 = true; bool b2 = true; bool b3 = true; bool areDifferent = b1 ^ b2 ^ b3; 如果只有两个布尔值(true或true)//false 但它不适用于n布尔(真异或真异或真)//true 问题:确定所有值是否与C#逻辑运算符(AND、or、XOR、XNOR)相等(或不相等)的正确通用方法是什么?如果有多个机会,最简单的方法是一个简单的LINQ语句: var allEqual = myBools.D
bool b1 = true;
bool b2 = true;
bool b3 = true;
bool areDifferent = b1 ^ b2 ^ b3;
如果只有两个布尔值(true或true)//false
但它不适用于n布尔(真异或真异或真)//true
问题:确定所有值是否与C#逻辑运算符(AND、or、XOR、XNOR)相等(或不相等)的正确通用方法是什么?如果有多个机会,最简单的方法是一个简单的LINQ语句:
var allEqual = myBools.Distinct().Count == 1;
交替循环您的值:
bool AllSame(IEnumerable<bool> bools)
{
var b1 = myBools.First();
foreach(var b = myBools.Skip(1))
if(b != b1)
return false;
return true;
}
bool AllSame(IEnumerable bools)
{
var b1=myBools.First();
foreach(var b=myBools.Skip(1))
如果(b!=b1)
返回false;
返回true;
}
或仅使用逻辑运算符:
请注意,您应该使用
ToArray
或ToList
来具体化集合,以避免相同集合的多次迭代。好的,如果您坚持某个解决方案必须使用逻辑运算符,下面是一个使用XOR运算符检查是否至少有一个项与其余项不同的解决方案:
public bool IsAnyValueDifferentFromRest(params bool [] values)
{
if (values.Any() == false)
{
throw new ArgumentException();
}
bool stillSame = values.First();
foreach (var boolValue in values.Skip(1)) // stole the skip part from HimBrombeere
{
// at the first difference you find you can exit
if (stillSame ^ boolValue)
{
return true;
}
}
return false;
}
我会说:
bool b1 = true;
bool b2 = true;
bool b3 = true;
bool areSame = (b1 && b2 && b3) || !(b1 || b2 || b3);
如果它们都是真的,那么部分将返回真的。
否则它将返回false
如果它们都为false,则或部分将返回false,而不是使其返回true。
否则,OR部分返回true,NOT将导致其返回false
因此,如果它们都是1或0,它将返回true
如果你想用另一种方式,否定它
要使其工作于任何值而不仅仅是布尔值,可以使用位运算符bool areDifferent = (bool) ~((b1 & b2 & b3) | ~(b1 | b2 | b3))
在这种情况下,&语句将生成一个位均为1的1。~ |语句将提供一个位均为0的1。
如果两个部分的值相同,则对这两个部分进行排序将得到一个均为1的值。
如果值都相同,则取反将得到所有0(因此逻辑为false)
这可以通过简单地根据需要输入任意值来扩展。是一个非常类似的问题(对于LINQ,我将使用
myBoolList.Distinct().Count()==1
)true异或true
将导致false,这将与true
异或,后者将返回true。这不是正确的逻辑吗?虽然dupe大约有3个值,但有多个值的答案。请仔细阅读。Dupe是关于三值异或的,它需要一个布尔值才能为真。这个问题是关于看3个值是否相同,这是一个不同的问题。这两个问题只与两个值相等。或者你可以通过另一个bool
表示isFirst
或使用bool?
的foreach
存储要比较的第一个值,谢谢你的回答,你能为你的方法添加代码吗?我已经将给出的示例转换为代码示例。