C# 如何将if,else-if逻辑转换为三元运算符?

C# 如何将if,else-if逻辑转换为三元运算符?,c#,ternary-operator,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; z = x == y ? z + x : x == z ? z + y : z + 1; z += x == y ? x : x == z

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

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 == y ? x :
  x == z ? y :
  1;
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;
}
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
你可以用

z += x == y ? x : x == z ? y : 1;
但老实说,这并不比你以前的阅读能力更强。您可以通过添加括号使其更加清晰:

z += x == y ? x : (x == z ? y : 1);
但通常我会远离嵌套的条件运算符,除非在打高尔夫球时。

情况如下:

z = x == y ? z += x : z += 1;
z =
  x == y ? z + x :
  x == z ? z + y :
  z + 1;
z +=
  x == y ? x :
  x == z ? y :
  1;
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;
}
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
如果使用
z+=x
作为操作数,它将执行
z=(z+=x)
。虽然它在这种特殊情况下有效,但由于表达式
z+=x
的结果是
z
的最终值,因此它在其他情况下可能不起作用

然而,由于所有操作都有相同的
z+=
,您可以这样做:

z = x == y ? z += x : z += 1;
z =
  x == y ? z + x :
  x == z ? z + y :
  z + 1;
z +=
  x == y ? x :
  x == z ? y :
  1;
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;
}
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))

不过要小心使用。代码越简单,其可读性和可维护性通常就越高,而嵌套的条件操作可读性不强。此外,仅当您有一个表达式作为条件运算的结果时,才使用它,它不是
if
语句的替代品。

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

if (x == y || x == z)
    z += y;
else 
   z++;    
如果我必须用三元来写,我会:

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

要将
z
计算转换为一行,我将执行以下操作:

z = x == y ? z += x : z += 1;
z =
  x == y ? z + x :
  x == z ? z + y :
  z + 1;
z +=
  x == y ? x :
  x == z ? y :
  1;
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;
}
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))
然后:


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

您应该使用以下括号:

z = x == y ? z += x : z += 1;
z =
  x == y ? z + x :
  x == z ? z + y :
  z + 1;
z +=
  x == y ? x :
  x == z ? y :
  1;
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;
}
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))

使用三元运算符继续操作很简单,而不是if-else-if条件,只需在“:”之后继续操作即可。下面是示例

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

“我开始使用三元运算符来减少代码行数,我很喜欢它”啊,哦,如果只有一条指令,你可以去掉大括号。它比三元的可读性更强。Imo@BoltClock你能不能解释一下为什么这样不好?我总是愿意听。你需要小心使用三元运算符。不要仅仅因为它看起来很酷或者只是为了减少代码行而使用它。正如Maresh所说,如果你真的想减少代码行数,你可以先去掉大括号。你不需要把所有的东西都挤在一行。你在这里给出的用例是一个你应该真正努力不使用它的用例,即使你理论上可以使用它。@BoltClock啊,我明白了,Thx有一些明智的换行符,我认为这可能比原来的更可读;为此添加了一个注释。递归:我只是尝试在多行上格式化它,但没能让它更容易理解。也许我只是太差劲了。但也许复杂的条件运算符很难格式化以保证可读性。@Joey:Guffa和我有同样的想法。对我来说,他的解决方案似乎很可读。@Ashburaczenko:有什么区别吗?@Ash Burlaczenko:但它的执行方式完全相同。没有必要决定是否添加
x
y
,如果两者都是相同的,如果它们不是,那么你就添加
y
。@AshBurlaczenko就我的测试而言,它是。是的,它实际上与原始的相同,因为当x==y时,z+=x与z+=y是相同的。然而,我很确定这只是一个例子,使用条件运算符才是真正的问题。这不是if-else的三元运算。@dicemaster是的,我知道。我提供了一种不同的方法,可以在使用时将条件压缩为一行。许多其他答案显示了三元结构(以及它最终看起来有多可怕)。