15

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

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

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

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

6 回答 6

39

它会是这样的:

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

如果你z += x用作操作数,它最终会做z = (z += x). 虽然它在这种特殊情况下有效,因为表达式的结果z += x是 的最终值z,它在其他情况下可能不起作用。

但是,由于所有操作都有z +=共同点,您可以这样做:

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

不过要小心使用。代码往往越简单,可读性和可维护性越高,嵌套条件操作的可读性也不是很高。此外,仅当您有一个表达式作为条件操作的结果时才使用它,它不是if语句的直接替换。

于 2012-07-11T15:30:17.357 回答
5

您可以使用

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

但老实说,这并没有比你以前的更具可读性。您可以通过添加括号使其更清晰:

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

但通常我会远离嵌套的条件运算符,除非在打高尔夫球时。

于 2012-07-11T15:28:45.213 回答
4

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

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

如果我必须使用三元来编写它,我会这样做:

z += (x == y || x == z) ? y : 1;
于 2012-07-11T15:31:26.613 回答
2

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

(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
于 2012-07-11T15:34:01.910 回答
1

这很容易继续使用三元运算符而不是 if else if 条件,即使在“:”之后也需要继续相同。下面是示例。

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

参考示例

于 2017-04-12T11:12:40.007 回答
0

要将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);

更具可读性,如果命名好并且方法具有单元测试覆盖率,那就更好了。

于 2012-07-11T15:32:12.370 回答