2012-03-08 42 views
9

¿Cómo puedo usar la condición ternaria ? : para realizar varias operaciones, si la expresión es verdadera/falsa?Usar el operador ternario para operaciones múltiples

wbsource = (exp) ? (Do one thing) : (Do second thing) wbsource = (exp) ? (Do one thing) (Do second thing) : (Do second thing)

Por ejemplo:

Por qué no puedo realizar tres operaciones entre ? y :

filename = (fp!=null) ? fp; Properties.Settings.Default.filename=fp; Properties.Settings.Default.Save; : Properties.Settings.Default.file; 

Con sencilla si la condición, habría escrito de una manera sencilla como:

if(fp!null) 
{ 
filename = fp; 
Properties.Settings.Default.filename; 
Properties.Settings.Default.Save(); 
} 
else 
{ 
filename = Properties.Settings.Default.file 
} 

¿Cuál es una manera dulce de escribir usando el operador ternario anterior?

+1

Me gusta el modo if/else en este caso - mucho más fácil de leer en mi humilde opinión ... – assylias

+3

Unario significa "con un solo operando". ¿? : 'tiene * tres * operandos - es un operador * ternario *, y su nombre es el operador condicional. –

Respuesta

14

¿Por qué no puedo realizar tres operaciones entre? y:

Debido a que estos son operandos, que son expresiones . Cada expresión evalúa un valor; desea múltiples declaraciones . De Eric Lippert's blog post about foreach vs ForEach:

La primera razón es que hacerlo viola los principios de programación funcional en los que se basan todos los demás operadores de secuencia. Claramente, el único propósito de una llamada a este método es causar efectos secundarios.

El propósito de una expresión es calcular un valor, no para causar un efecto secundario. El propósito de una declaración es causar un efecto secundario. El sitio de llamada de esta cosa se vería un montón, como una expresión (aunque, es cierto, ya que el método es de huecos de regresar, la expresión sólo podía utilizarse en un contexto “expresión comunicado”.)

Usted debe absolutamente escribir esto usando un bloque if. Está más claro.

Si muy, muy desea utilizar el operador condicional para esto, se podría escribir:

// Please, please don't use this. 
Func<string> x =() => { 
    Properties.Settings.Default.filename = fp; 
    Properties.Settings.Default.Save(); 
    return fp; 
}; 

string filename = fp == null ? Properties.Settings.Default.file : x(); 
+1

¿Por qué no declarar la función anónimamente en línea (broma) – Jodrell

2

Si realmente, realmente desea, se puede utilizar una función que tiene side effects:

filename = (fp!=null) ? DoOneThing(...) : DoAnotherThing(...); 

Aunque quienquiera que mantenga su código no le agradecerá.

3

El operador condicional, que es un operador ternario (no un operador unario), no es un reemplazo para una declaración if. Es un operador que devuelve uno de dos resultados. Si bien puede encadenar esto hasta cierto punto:

var result = someBool ? "a" : (otherBool ? "b" : "c"); 

Eso se pone un poco difícil de leer. Además, está tratando de llamar a la función Save(), que no devuelve ningún resultado, por lo tanto, no puede usarlo con este operador.

1

Respuesta corta, utilice un bloque if, es lo único sensato que puede hacer.

Otra respuesta, para el individuo insano, sucio y maloliente.

filename = (fp!=null) ? Func<string> {fp = Properties.Settings.Default.filename; Properties.Settings.Default.Save; return fp;} : Properties.Settings.Default.file; 
2

Si esto era c que habría OK gracias a la "comma operator":

int b; 
int a = (1==1) ? (b=6, somemethod(), 1) : (b=7, 2); 

Aquí b se ajustará a 6, somemethod serán llamados y luego a se establece en 1.

Afortunadamente esa fue una característica que no se transfirió, use if..else es mucho más claro.

Cuestiones relacionadas