如果转换为if,否则如果逻辑成为三元运算符?

我只是想知道这是否可能,因为我开始使用三元运算符来减少代码行,我很喜欢它。

if (x==y) { z += x; } else if (x==z) { z += y; } else { z += 1; } 

如果只有一个if语句,我现在可以这样做:

 z = x == y ? z += x : z += 1; 

它会是这样的:

 z = x == y ? z + x : x == z ? z + y : z + 1; 

如果使用z += x作为操作数,它将最终执行z = (z += x) 。 虽然它适用于这种特殊情况,但由于表达式z += xz的最终值,因此在其他情况下可能不起作用。

但是,因为所有操作都有z +=共同点,你可以这样做:

 z += x == y ? x : x == z ? y : 1; 

但要小心使用。 代码通常更易读和可维护,而且嵌套的条件操作不是很易读。 另外,只有当条件操作的结果有表达式时才使用它,它不是if语句的替代品。

您可以使用

 z += x == y ? x : x == z ? y : 1; 

但说实话,这并不比以前更具可读性。 您可以通过添加括号使其更清晰:

 z += x == y ? x : (x == z ? y : 1); 

但一般来说,除非打高尔夫球,否则我会远离嵌套的条件运算符。

四行代码,最易读,IMO。 这里不需要三元运算符:

 if (x == y || x == z) z += y; else z++; 

如果我不得不用三元写它,我会这样做:

 z += (x == y || x == z) ? y : 1; 

你应该通过使用这样的括号来做到这一点:

 (x==y)?(z+=x):((x==z)?(z+=y):(z+=1)) 

要将z计算转换为一行,我会做这样的事情:

 public int GetZBasedOnXY(int z, int x, int y) { // Chose this solution, but any can go in here and work. if (x == y || x == z) return z + y; else return z + 1; } 

然后:

 z = GetZBasedOnXY(z, x, y); 

更具可读性,如果命名良好且方法具有unit testing覆盖率,则更好。

这很容易继续使用三元运算符而不是if else if条件,只需要在“:”之后继续相同。 以下是样本。

 var result = a ? x : b ? y : z; 

参考例子