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

时间:2012-07-11 15:27:22

标签: c# ternary-operator

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

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

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

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

6 个答案:

答案 0 :(得分:29)

就像这样:

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语句的替代品。

答案 1 :(得分:5)

您可以使用

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

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

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

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

答案 2 :(得分:4)

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

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

这很容易继续使用三元运算符而不是if else if条件,即使在"之后也需要继续运行:"。以下是样本。

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

https://www.npmjs.com/package/notp

答案 5 :(得分: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);

更具可读性,如果命名良好且方法具有单元测试覆盖率,则更好。