确定值是否不同

Dr.*_*ail 4 c# boolean

假设我有 4 个变量

bool value1 = false;
bool value2 = false;
bool value3 = true;
bool value4 = false;
Run Code Online (Sandbox Code Playgroud)

并且它们都没有相同的值(都是真的,||都是假的)

我找到了 2 种方法,无论如何它们看起来都不容易理解。

bool areDifferent = !(value1 == value2 == value3 == value4);
Run Code Online (Sandbox Code Playgroud)

bool areDifferent = new[] { value1, value2, value3, value4 }.Distinct().Count() > 1;
Run Code Online (Sandbox Code Playgroud)

问题:是否有其他方法,在可读性/可理解性方面更好?

Ser*_*kiy 10

为了可读性和理解性,我会交换逻辑。当您检查值是否不同时,不清楚 - 所有值都应该不同(考虑整数值 1、2、3),或者值可能相等,但至少有一个不同的值(1、2、1)?当您检查所有值是否相等时,它总是很清楚。

我会将此逻辑提取到命名良好的方法中(如果需要,您甚至可以将其设为通用):

public static bool AllEqual(params bool[] values)
{
    if (values.Length == 0)
       return true;

    var first = values[0];
    for (int i = 1; i < values.Length; i++)
        if (values[i] != first)
            return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

和用法

var notAllEqual = !AllEqual(value1, value2, value3, value4);
Run Code Online (Sandbox Code Playgroud)

使用声明式方法,您的代码描述您在做什么,而不是告诉读者如何做,让读者自己了解什么。


更新:如果你总是处理四个布尔值,检查它们是否不完全相等的最简单方法是

(value1 ^ value2) || (value2 ^ value3) || (value3 ^ value4)
Run Code Online (Sandbox Code Playgroud)

但就可读性而言,任何命令式方法都比声明式方法差