2012-07-11 11 views
10

Me preguntaba si esto fue posible porque comencé a usar operadores ternarios para reducir las líneas de código y me encanta.¿Cómo activar si, de lo contrario, si la lógica en un operador ternario?

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

puedo hacer esto ahora si sólo hay una instrucción if como esta:

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

"Empecé a usar los operadores ternarios para reducir las líneas de código y soy amante de ella" Uh oh. – BoltClock

+0

Bueno, si solo hay una instrucción, puede quitar llaves. Y es más legible que ternario. Imo – Maresh

+0

@BoltClock En lugar de decir eso, ¿puedes explicar por qué es malo? Siempre estoy dispuesto a escuchar. –

Respuesta

26

Sería así:

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

Si utiliza z += x como un operando que va a terminar haciendo z = (z += x). Si bien funciona en este caso especial, como resultado de la expresión z += x es el valor final de z, es posible que no funcione en otros casos.

howver, ya que todas las operaciones tienen la z += en común, se puede hacer así:

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

uso con cuidado, sin embargo. El código a menudo es más legible y fácil de mantener, más simple y las operaciones condicionales anidadas no son muy legibles. Además, use esto solo cuando tenga una expresión como resultado de la operación condicional, no es un reemplazo directo para la declaración if.

+0

¡Gracias, eso es asombroso! –

5

Usted puede utilizar

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

Pero, honestamente, eso no es realmente más fácil de leer que lo que tenido antes. Puede que sea un poco más claras mediante la adición de paréntesis:

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

Pero en general, me quedaría lejos de los operadores condicionales anidados cuando menos jugar al golf.

+10

"Can". Pero por favor no lo hagas –

+0

Con algunas líneas nuevas juiciosas, creo que esto podría ser * más * legible que el original. – recursive

+0

Michael: De acuerdo; agregó una nota para eso. recursivo: intenté formatearlo en varias líneas, pero no pude hacerlo más comprensible. Tal vez solo apesta. Pero tal vez los operadores condicionales complejos sean difíciles de formatear para su legibilidad. – Joey

4

Cuatro líneas de código, y la más fácil de leer, IMO. No hay necesidad de un operador ternario aquí:

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

Si tuviera que escribirlo usando ternario, lo haría:

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

Eso no es lo mismo que su código de orignal. –

+0

@AshBurlaczenko: ¿Cuál es la diferencia? – recursive

+0

@Ash Burlaczenko: Sin embargo, se ejecuta exactamente de la misma manera. No tiene sentido decidir si agregar 'x' o' y' si ambos van a ser iguales, y si no lo están, entonces estás agregando 'y' * de todos modos *. – BoltClock

0

Para activar el cálculo z en una sola línea, me gustaría hacer algo como esto :

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; 
} 

continuación:

z = GetZBasedOnXY(z, x, y); 

Más fácil de leer, y si el nombre es bueno y el método tiene cobertura de prueba unitaria, aún mejor.

2

que debe hacer esto mediante el uso de paréntesis, así:

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

Esto es simple para continuar con el operador ternario en lugar de si condición else if, sólo tiene que seguir la misma, incluso después de ":". a continuación está la muestra.

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

Reference example

Cuestiones relacionadas