2009-10-12 25 views
31

tengo que poner en práctica lo siguiente en un comunicado switch:evaluar expresiones en sentencias switch en C#

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    case < 0: 
    // some code ; 
    break; 
} 

¿Es posible tener la sentencia switch evaluar case < 0? Si no, ¿cómo podría hacer eso?

+4

No marques tu pregunta como "Urgente", incluso si es para ti: http://catb.org/~esr/faqs/smart-questions.html#urgent –

Respuesta

57

No puede - el interruptor/caja es solo para valores individuales. Si desea especificar condiciones, es necesario un "si":

if (num < 0) 
{ 
    ... 
} 
else 
{ 
    switch(num) 
    { 
     case 0: // Code 
     case 1: // Code 
     case 2: // Code 
     ... 
    } 
} 
+0

Muchas gracias –

+22

o incluso switch (num) {case 0: case 1: default: if (num <0) {..}} – falstro

+2

@roe: Sí, consideré dar esa forma también. Sin embargo, se agotó el tiempo :) –

5

Usted tendrá que utilizar si, ya sea que se quiera o no. Switch solo es capaz de comparar tu valor con valores constantes.

+1

No es cierto: puede usar un operador ternario para consolidar el caso menos que cero en un solo valor, y evaluar eso en el cambiar. –

+0

Esto es cierto. Es solo una restricción del lenguaje. En realidad, puede hacer esto en VB.Net, así como otras cosas como usar rangos de valores. Al igual que C#, si tiene que comparar con el valor literal, pero hay más operaciones de comparación disponibles. –

+0

¿Realmente Charles? Interesante. No sabía eso. –

7

Si su num no puede ser menor que cero:

public int GetSwitch(int num) { return num < 0 ? -1 : num; } 
switch(GetSwitch(num)) 
{ 
case 4: // some code ; break; 
case 3:// some code ; break; 
case 0: // some code ; break; 
case -1 :// some code ; break; 
} 

Si puede, utilice algún otro número "inexistente" como int.MinValue.

+0

Eso es lo que iba a sugerir, pero ¿por qué poner el ternario en una función diferente? –

+0

solución interesante +1, aunque personalmente siento que la llamada a la función adicional desordena la vista un poco, 'switch (num <0? -1: num)' solo se siente más explicto. – falstro

+0

Soy un gran seguidor de SRP y DRY, por lo que incluso inconscientemente separaba un comportamiento de otro comportamiento no relacionado. GetSwitch(), por ejemplo, se puede reutilizar, y ¿qué pasa si necesita dos interruptores? ¿Copia/pega su ternario allí? No considero copiar/pegar una buena práctica. – queen3

5

La única manera de que pudiera pensar (y realmente no recomiendo que), sería la siguiente:

int someValue; 

switch (Math.Max(someValue, -1)) 
{ 
    case -1: 
     // will be executed for everything lower than zero. 
     break; 

    case 0: 
     // will be executed for value 0. 
     break; 

    case 1: 
     // will be executed for value 1. 
     break; 

    default: 
     // will be executed for anything else. 
     break; 
} 
+0

¿Por qué estoy bajando la votación? –

+0

¿Por qué no solo Math.Max ​​(someValue, -1)? Entonces él no tiene que preocuparse por el desplazamiento de +1 ... – JustLoren

+0

No te devolví el voto, pero creo que es solo Bad Style. – chakrit

13

Se podría hacer algo como esto al final de su sentencia switch:

default: 
    if(num < 0) 
    { 
     ... // Code 
    } 
    break; 
3

El revés sería posible también (en relación con la respuesta de Jon Skeet):

switch(num) 
{ 
    case a: 
     break; 
    default: 
     if(num < 0) 
     {} 
    break; 
} 
1

no nos puede Comparaciones en interruptores como usted podría en VB, tiene 2 opciones aquí, reemplace el valor que enciende con un valor conocido y use eso o, si se refiere a todos los demás casos, puede usar la cláusula predeterminada:

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    default: 
    // some code ; 
    break; 
} 

Tenga en cuenta que esto no es exactamente como usted pidió: cualquier valor distinto de 0,3,4 terminará en la cláusula deafult :.

Cuestiones relacionadas