2010-03-31 10 views
15

¿Alguien sabe si es posible incluir un rango en una declaración de cambio (y si es así, cómo)?Cambio de instrucción en C#

Por ejemplo:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2..8: 
    //do something else 
    break; 
    default: 
    break; 
} 

el compilador no parece que les gusta este tipo de sintaxis - no lo hace como:

case <= 8: 

Respuesta

23

No, esto no es posible. Hay algunas maneras que he hecho esto en el pasado:

codificación fija:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

En combinación con un if {} declaración:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    default: 
    if (x <= 8) 
    { 
     // do something 
    } 
    else 
    { 
     // throw exception 
    } 
    break; 
} 
+2

+1 para el segundo ejemplo.El primero me hace querer lastimar a alguien. :) –

+0

El primer ejemplo parece extraño: sé que es cierto para, por ejemplo, Java, pero la [entrada de MSDN] (https://msdn.microsoft.com/en-us/library/06tc147t.aspx) para 'cambiar 'establece explícitamente que el compilador no permitirá" errores ". ¿O me estoy perdiendo algo aquí? – Informagic

+0

Está bien, aparentemente esto está permitido para 'case's" vacíos ". – Informagic

3

Respuesta corta: sin. Sería posible escribir todos los casos allí, pero dicha notación de rango no es compatible.

Creo que tiene que usar la declaración if aquí o cambiar a un idioma donde haya un mejor soporte para la descriminación de casos.

2

Si tiene tan pocos casos, se preferirá if.

1

Podría manejar los casos explícitos, caso por caso, y si solo tiene un rango, trátelo en el caso predeterminado.

-1

que puede hacer

case 2: 
case 3: 
case 4: 
... 
case 8: 
// code here 
break 
+0

[-] Esta respuesta ya ha sido proporcionada por Andy Shellam arriba. –

5

No, pero se puede escribir esto, por lo que al menos evitar la escritura de los // do something else parte varias veces.

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: case 3: case 4: case 5: case 6: case 7: case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 
+0

ya mencionado anteriormente, pero punto importante sobre el formato :) me importa la comunicación –

-1

Usted puede utilizar caída caso a través de:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

Pero yo solo usaría si fuera por esto.

+0

[-] Esta respuesta ya ha sido proporcionada por Andy Shellam arriba. –

-1

No puede usar ninguna declaración condicional en una caja de interruptor.

Si desea ejecutar las mismas líneas de código para diferentes opciones a continuación, puede hacer una cosa:

switch (i) 
      { 
       case 0: 
       case 1: 
       case 2: 
       case 3: 
        //do something here. 
        break; 
       default: 
        //do something here. 
        break; 
      } 
+0

[-] La respuesta anterior ya fue proporcionada por Andy Shellam. –

2

Una posibilidad es convertir sus rangos en enteros. Por ejemplo:

//assuming x>=9 or if (x <= 0) return; 
     switch((x+12)/7) 
     { case 1:Console.WriteLine("one"); 
       break; 
      case 2:Console.WriteLine("2 through 8 inclusive"); 
       break; 
      case 3:Console.WriteLine("9 through 15 inclusive"); 
       break; 
      default: Console.WriteLine("16 or more"); 
       break; 
     } 
0

Mientras que esto no era posible cuando originalmente hice esta pregunta, a través del milagro de C a juego # Patrón, es ahora (en C# 7):

switch (i) 
{ 
    case var test when test <= 2: 
     Console.WriteLine("Less than 2"); 
     break; 

    case var test when test > 2 && test < 10: 
     Console.WriteLine("Between 2 and 10"); 
     break; 

    case var test when test >= 10: 
     Console.WriteLine("10 or more"); 
     break; 
} 

A blog post on the subject

Cuestiones relacionadas