Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用逻辑运算符确定差异_C#_Boolean_Logic - Fatal编程技术网

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
存储要比较的第一个值,谢谢你的回答,你能为你的方法添加代码吗?我已经将给出的示例转换为代码示例。