2011-03-18 17 views
5

¿Hay una manera de .NET para reemplazar un código en caso intervalos se comparan como¿Hay una forma elegante de reemplazar si se usa algo así como el interruptor cuando se trata de intervalos?

if (compare < 10) 
     { 
      // Do one thing 
     } 
     else if (10 <= compare && compare < 20) 
     { 
      // Do another thing 
     } 
     else if (20 <= compare && compare < 30) 
     { 
      // Do yet another thing 
     } 
     else 
     { 
      // Do nothing 
     } 

por algo más elegante como una instrucción switch (pienso en Javascript "caso (< 10)" obras, pero en C#)? ¿Alguien más encuentra este código también feo?

Respuesta

4

Una simplificación: ya que estos son todos los demás - si en lugar de sólo si , no es necesario para comprobar la negación de las condiciones anteriores. Es decir, esto es equivalente a su código:

if (compare < 10) 
{ 
    // Do one thing 
} 
else if (compare < 20) 
{ 
    // Do another thing 
} 
else if (compare < 30) 
{ 
    // Do yet another thing 
} 
else 
{ 
    // Do nothing 
} 
+0

verdad - ¿por qué no R # ven esto? ¿Por qué no? – Olaf

2

Como ya ha afirmado que compare >= 10 después de la primera if, que realmente no necesitan la prueba de límite inferior en el segundo (o cualquiera de los otros) if s ...

No es bonito, pero switch se implementó originalmente mediante hashing en C, por lo que en realidad era más rápido que una cadena if...else if. Tal implementación no se adapta bien a los rangos generales, y es por eso que solo se permitieron casos constantes.

Sin embargo, por el ejemplo que da en realidad se podría hacer algo como:

switch(compare/10) { 
    case 0: 
     // Do one thing 
    break; 
    case 1: 
     // Do another thing 
    break; 
    case 2: 
     // Do yet another thing 
    break; 
    default; 
     // Do nothing 
    break; 
} 
+0

En cuanto a su 'interruptor (comparar/10)', ¿qué pasa si 'compare' es negativo? – Justin

+0

@Justin, sí, pensé en eso después de publicarlo, pero decidí ignorarlo ... En cuyo caso necesitarías un 'si' en el frente o' Math.Max ​​(0, comparar/10) 'para el expresión. – jswolf19

+0

La intención de la pregunta es más genérica: ¿hay estructuras de código generales que cubran este tipo de cosas y que se apliquen también si los intervalos son irregulares? – Olaf

Cuestiones relacionadas