【问题标题】:Determine difference with logic operators用逻辑运算符确定差异
【发布时间】:2021-01-21 07:25:28
【问题描述】:

我有这行代码

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)确定所有值是否相等(或不相等)的正确通用方法是什么

【问题讨论】:

  • here 是一个非常相似的问题
  • (使用 LINQ,我会使用 myBoolList.Distinct().Count()==1
  • true XOR true 将导致 false 并且将与 true 进行异或,这将返回 true。这不是正确的逻辑吗?
  • 虽然骗子大约是 3 个值,但有多个值的答案。请仔细阅读。
  • Dupe 是关于三元异或的,它需要一个布尔值才能为真。这个问题是询问查看 3 个值是否相同,这是一个不同的问题。这 2 个问题仅与 2 个值等价。

标签: c# boolean logic


【解决方案1】:

好的,如果您坚持必须使用逻辑运算符的解决方案,这里是使用 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;
}

【讨论】:

    【解决方案2】:

    你有很多机会,最简单的是一个简单的 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;
    }
    

    或者也只使用逻辑运算符:

    请注意,您应该使用ToArrayToList 实现集合,以避免对同一集合进行多次迭代。

    【讨论】:

    • 或者您可以只使用foreach 并存储要比较的第一个值,方法是使用另一个bool 表示isFirst 或使用bool?
    【解决方案3】:

    我会去:

    bool b1 = true;
    bool b2 = true;
    bool b3 = true;
    
    bool areSame = (b1 && b2 && b3) || !(b1 || b2 || b3);
    

    如果它们都为真,则 AND 部分将返回真。 否则会返回 false。

    如果它们都是 false,OR 部分将返回 false,NOT 将导致它返回 true。 否则 OR 部分返回 true 而 NOT 将导致它返回 false。

    所以如果它们都是1或全0,它会返回true。

    如果你想要它,否定它。

    要使其适用于任何值而不仅仅是布尔值,您可以使用位运算符

    bool areDifferent = (bool) ~((b1 & b2 & b3) | ~(b1 | b2 | b3))
    

    在这种情况下,& 语句将产生一个 1,其中该位全为 1。 ~|语句将提供一个 1,其中该位全为 0。 如果值相同,则对 2 个部分进行或运算将为您提供一个全为 1 的值。 如果值都相同,则否定将给你所有 0(因此逻辑错误)。

    这可以通过简单地根据需要输入尽可能多的值来扩展。

    【讨论】:

    • 感谢您的回答,您能否为您的方法添加代码?
    • 我已将给出的示例转换为代码示例。
    猜你喜欢
    • 2020-12-20
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2011-09-23
    • 2011-08-25
    相关资源
    最近更新 更多