2010-03-01 14 views
38

Muy a menudo en mi código que necesita para comparar una variable para varios valores:Al comparar una variable para varios valores

if (type == BillType.Bill || type == BillType.Payment || type == BillType.Receipt) 
{ 
    // Do stuff 
} 

sigo pensando que puedo hacer:

if (type in (BillType.Bill, BillType.Payment, BillType.Receipt)) 
{ 
    // Do stuff 
} 

Pero de eso curso SQL que permite esto.

¿Hay alguna manera más ordenada en C#?

+1

lenguajes como Python y Ruby tienen el "en" operador, también. –

+0

@ Can Berk Güder: Acabo de buscar este operador "en" en Ruby pero no puedo encontrarlo ni nada parecido. ¿Algunas ideas? –

+1

[1,2,3] .include? (1) –

Respuesta

58

que podría hacer con la .Contains como este:

if(new[]{BillType.Receipt,BillType.Bill,BillType.Payment}.Contains(type)){} 

O bien, crear su propio método de extensión que lo hace con una sintaxis más legible

public static class MyExtensions 
{ 
    public static bool IsIn<T>(this T @this, params T[] possibles) 
    { 
     return possibles.Contains(@this); 
    } 
} 

Entonces llamarlo por:

if(type.IsIn(BillType.Receipt,BillType.Bill,BillType.Payment)){} 
0

Pruebe usar C# HashSet para la lista de valores. Esto puede ser especialmente útil si necesita comparar muchos valores con un único conjunto de valores.

6

tipo Suponiendo es una enumeración, se puede utilizar el FlagsAttribute:

[Flags] 
enum BillType 
{ 
    None = 0, 
    Bill = 2, 
    Payment = 4, 
    Receipt = 8 
} 

if ((type & (BillType.Bill | BillType.Payment | BillType.Receipt)) != 0) 
{ 
    //do stuff 
} 
+0

Desafortunadamente, esto solo funcionará para enumeraciones que no tengan sus valores ya definidos. En este caso particular, nuestros BillTypes ya se han definido como 1-8 ... Lamentablemente, me gusta la pulcritud de este ... –

+5

Recomiendo reservar FlagsAttribute para cosas que son, bueno, banderas. Decorar el BillType con '[Flags]' me dice que cualquier combinación de BillTypes se puede aplicar al valor, lo que claramente no es el caso. –

+0

@Mike en ese caso, ¿por qué deberían hacer lo mismo con ellos? En un sistema diferente, un BillType puede ser una bandera. Aunque tienes razón, parece un olor a código para mí. Puedo derribarlo. –

0

Trate de ver el patrón de diseño de estrategia (también conocido como el patrón de diseño de políticas).

public interface IBillTypePolicy 
{ 
    public BillType { get; } 
    void HandleBillType(); 
} 
public class BillPolicy : IBillTypePolicy 
{ 
    public BillType BillType { get { return BillType.Bill; } } 

    public void HandleBillType() 
    { 
     // your code here... 
    } 
} 

Aquí hay un great post on how to dynamically resolve the policy de Los Techies.

+0

Buen patrón, problema equivocado. ¡Esto no responde la pregunta original! –

+0

Veo de dónde vienes. Es una solución de mayor nivel para el problema y podría valer la pena considerarla en algunos casos si estoy poniendo muchas declaraciones de if en todo el lugar. –

9

También existe la instrucción de interruptor

switch(type) { 
    case BillType.Bill: 
    case BillType.Payment: 
    case BillType.Receipt: 
     // Do stuff 
     break; 
} 
3

intentar usar un interruptor de

switch (type) 
    { 
     case BillType.Bill: 
     case BillType.Payment: 

     break; 
    } 
Cuestiones relacionadas