用逻辑运算符确定差异
Determine difference with logic operators
我有这行代码
bool b1 = true;
bool b2 = true;
bool b3 = true;
bool areDifferent = b1 ^ b2 ^ b3;
这有效,如果只有 2 个布尔值 (true XOR true) // false
但它不适用于 n 个布尔值 (true XOR true XOR true) // 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;
}
或者也只使用逻辑运算符:
请注意,您应该使用 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);
如果它们都为真,则 AND 部分将 return 为真。
否则它将 return false.
如果它们都是假的,则 OR 部分将 return 假,NOT 将导致它 return 真。
否则 OR 部分 return 为真而 NOT 将导致它 return 为假。
因此,如果它们全为 1 或全为 0,它将 return 为真。
反之则否定
要使其适用于任何值而不仅仅是布尔值,您可以使用按位运算符
bool areDifferent = (bool) ~((b1 & b2 & b3) | ~(b1 | b2 | b3))
在这种情况下,& 语句将产生一个 1,其中该位全为 1。~|语句将提供一个 1,其中该位全为 0。
如果值相同,则对 2 个部分进行 ORing 会给你一个全为 1 的值。
如果值都相同,则否定会给你所有 0(因此逻辑错误)。
这可以通过简单地根据需要输入尽可能多的值来扩展。
我有这行代码
bool b1 = true;
bool b2 = true;
bool b3 = true;
bool areDifferent = b1 ^ b2 ^ b3;
这有效,如果只有 2 个布尔值 (true XOR true) // false
但它不适用于 n 个布尔值 (true XOR true XOR true) // 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;
}
或者也只使用逻辑运算符:
请注意,您应该使用 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);
如果它们都为真,则 AND 部分将 return 为真。 否则它将 return false.
如果它们都是假的,则 OR 部分将 return 假,NOT 将导致它 return 真。 否则 OR 部分 return 为真而 NOT 将导致它 return 为假。
因此,如果它们全为 1 或全为 0,它将 return 为真。
反之则否定
要使其适用于任何值而不仅仅是布尔值,您可以使用按位运算符
bool areDifferent = (bool) ~((b1 & b2 & b3) | ~(b1 | b2 | b3))
在这种情况下,& 语句将产生一个 1,其中该位全为 1。~|语句将提供一个 1,其中该位全为 0。 如果值相同,则对 2 个部分进行 ORing 会给你一个全为 1 的值。 如果值都相同,则否定会给你所有 0(因此逻辑错误)。
这可以通过简单地根据需要输入尽可能多的值来扩展。