2012-09-05 17 views
11

Quiero preguntarle a alguien que tiene habilidades más fuertes que yo en C#.¿Es posible definir algo así como 'between' en la sentencia if-else en C#?

¿Es posible reducir el siguiente código

if(val > 20 && val < 40) 
... 
else 
if(val > 40 && val < 72) 
... 
else 
if(val > 72 && val < 88) 
... 
else 
... 

Supongamos que tengo más de 10-11 if-else declaraciones.

Cuál es la mejor manera de acortar el código anterior?

Pensé en algo así como between en sql.

+0

¿Estás haciendo cosas completamente diferentes en cada bloque de código? Podría tener una lista/matriz con 20,40,72, etc. siempre que el bloque de código sea el mismo pero con el índice del grupo en el que se encuentra. – Servy

+0

Es posible en VB pero, a mi entender, no en C#. – Magnus

+0

@Magnus Para ser justos, puede crear trivialmente una sintaxis basada en bibliotecas que coincida con la sintaxis de 'Seleccionar caso' en VB en concisión (pero sí, ninguna existe en el marco). –

Respuesta

28

Definir una extension method:

public static bool Between(this int source, int a, int b) 
{ 
    return source > a && source < b; 
} 

A continuación, utilizarlo:

if (val.Between(20, 40)) 
//... 

Como oɔɯǝɹ de manifiesto acertadamente en su comentario, usted podría ir un paso más allá y apoyo todos los implementadores de IComparable<T> con un método de extensión genérico:

public static bool Between<T>(this T source, T a, T b) where T : IComparable<T> 
{ 
    return source.CompareTo(a) > 0 && source.CompareTo(b) < 0; 
} 
+12

puede hacer esto también un método de extensión genérico: 'bool estático público Entre (esta fuente T, T a, T b): donde T: IComparable ' –

+0

* excelente * sugerencia! – Adam

-1
if(val > 72) 
{ 

} 
else 
{ 
    if(val > 40) 
    { 
    ... 
    } 
    else 
    { 
    ... 
    } 
} 
4

Una forma alternativa de hacerlo es almacenar sus rangos en la lista y usar la función Contiene para averiguar si val está dentro del rango, pero sin más información parece que la tiene tan corta como puede hacer eso.

1

Puede hacer un intermedio, pero será mucho más tipear para llamarlo. En este caso, si realmente quería lo between hace, entonces sería más concisa con:

if(val >= 20 && val <= 88) 
{ 
    if(val <= 40) 
    ... 
    else if(val <= 72) 
    ... 
} 
else 
... 

Tenga en cuenta que estoy usando <= y >= para que coincida con el entre el comportamiento. Sin embargo, estoy suponiendo que se quería ni tienen dos cosas para los valores exactamente 40, exactamente 72, ni nada hecho (en su pregunta, no se haría nada).

0
class Range{ public int first; public int second} 

list<Range> rangeList= new list<Range> 

escribir todas las combinaciones en la lista con la clase

foreach(Range objRange in rangeList) 
{ 
if(val>objRange.first && val<objRange.last) 
{...... 
break; 
} 
} 
+0

@snake ojo prueba mi este enfoque también puede acortar tu código de manera estándar –

+0

Realmente necesitas trabajar en tus nombres de Clase/variable ... Mejorará * significativamente * la legibilidad de tu código. – Servy

+0

@Servy pls sugieren que el concepto es correcto o no, he editado para nombrar –

1

En mi opinión es bueno tener colección de rangos. Y si la lógica dentro de los bloques es bastante similar, puede almacenar un delegado asociado a este rango.

RangeBase range = collection.FirstOrDefault(x => x.BelongsToRange(42)); 
if(range != null) 
{ 
    dynamic result = range.SomeDelegate.DynamicInvoke(); 
} 

Dónde RangeBase es una simple abstracción:

public abstract class RangeBase 
{ 
    public int MinValue { get; private set; } 
    public int MaxValue { get; private set; } 

    public abstract Delegate SomeDelegate { get; } 

    protected RangeBase(int minValue, int maxValue) 
    { 
     MinValue = minValue; 
     MaxValue = maxValue; 
    } 

    public bool BelongsToRange(int number) 
    { 
     return number > MinValue && number < MaxValue; 
    } 
} 
+1

Al igual que toda la programación, esto es realmente una compensación entre donde está haciendo su esfuerzo. Me gusta la solución, pero al final es suficiente trabajo que probablemente no haya ahorrado tiempo en el mundo real para este proyecto actual. Sin embargo, la suya es una gran solución si necesita este tipo de cosas en muchos proyectos, en cuyo caso le gustaría poner las bases abstractas en una biblioteca que use con todos los proyectos futuros. – Stuporman

Cuestiones relacionadas