多个变量之间的平等比较

JPR*_*ddy 37 c# comparison equality operators

我需要检查多个变量是否具有相同的数据,例如

var x=1;
var y=1;
var z=1;
Run Code Online (Sandbox Code Playgroud)

我想检查x == 1和y == 1 z == 1(它可能是'1'或其他值).而不是这个,是否有任何简短的方法,我可以实现相同,如下

if(x==y==z==1)
Run Code Online (Sandbox Code Playgroud)

这可能在C#中吗?

jev*_*lio 59

KennyTM是正确的,没有其他更简单或更有效的方法.

但是,如果你有很多变量,你也可以构建一个值数组并使用IEnumerable.All方法来验证它们都是1.更可读,IMO.

if (new[] { v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 }.All(x => x == 1))
Run Code Online (Sandbox Code Playgroud)

代替

if(v1 == 1 && v2 == 1 && v3 == 1 && v4 == 1 && v5 == 1 && v6 == 1 && v7 == 1 && v8 == 1 && v9== 1 && v10 == 1)
Run Code Online (Sandbox Code Playgroud)

  • 因此,对于 OR (||) 语句,您可以只执行 .Any 而不是 .All? (2认同)

Mau*_*Mau 29

if (x == y && y == z && z == 1)
Run Code Online (Sandbox Code Playgroud)

是你能做的最好的,因为

y == z求值为布尔值,您无法x与结果进行比较:

x == (y == z)

|    |

int  bool
Run Code Online (Sandbox Code Playgroud)

我会这样做:

public bool AllEqual<T>(params T[] values) {
    if(values == null || values.Length == 0)
         return true;
    return values.All(v => v.Equals(values[0]));    
}

// ...

if(AllEqual(x, y, z)) { ... }
Run Code Online (Sandbox Code Playgroud)


Jam*_*Ide 25

如果您只想测试x == y == z,您可以使用:

var allEqual = new[] {x, y, z}.Distinct().Count() == 1;
Run Code Online (Sandbox Code Playgroud)

如果要测试它们是否都等于1,请在集合中添加1:

var allEqual1 = new[] {x, y, z, 1}.Distinct().Count() == 1;
Run Code Online (Sandbox Code Playgroud)

或者All像在fencliff的回答中一样使用.

  • 要注意大集合,这是O(N log N),而公认的解决方案是O(N). (4认同)
  • +1.辉煌.我接受这个答案.这不是你知道多少,而是你知道你所知道的有多好.我的回答看起来很傻. (2认同)

ken*_*ytm 10

if (x == y && y == z && z == 1)
Run Code Online (Sandbox Code Playgroud)

没有其他简单或更有效的方法.


mdi*_*bio 5

对于整数类型,该如何处理:

int x = 3, y = 3, z = 3;

if((x & y & z & 3) == 3)
  //...have same data
Run Code Online (Sandbox Code Playgroud)

用于测试任何非零值。要使此功能可重用,还需要进行更多检查。但是,如OP所述,它可能适用于非零相等性的内联检查。