2009-12-21 20 views
5

Me gustaría encontrar una forma de verificar si un conjunto de valores está contenido en mi variable.Establecer en enumeración para C#

[Flags] 
public enum Combinations 
{ 
    Type1CategoryA = 0x01,  // 00000001 
    Type1CategoryB = 0x02,  // 00000010 
    Type1CategoryC = 0x04,  // 00000100 
    Type2CategoryA = 0x08,  // 00001000 
    Type2CategoryB = 0x10,  // 00010000 
    Type2CategoryC = 0x20,  // 00100000 
    Type3 = 0x40    // 01000000 
} 

bool CheckForCategoryB(byte combinations) 
{ 

    // This is where I am making up syntax 

    if (combinations in [Combinations.Type1CategoryB, Combinations.Type2CategoryB]) 
     return true; 
    return false; 

    // End made up syntax 
} 

Soy un trasplante a .NET de Delphi. Este es un código bastante fácil de escribir en Delphi, pero no estoy seguro de cómo hacerlo en C#.

Respuesta

16

Si se refiere a "por lo menos una de las banderas":

return (combinations 
    & (byte)(Combinations.Type1CategoryB | Combinations.Type2CategoryB)) != 0; 

también - si se declara como Combinations combinations (en lugar de byte), se puede eliminar la (byte)

bool CheckForCategoryC(Combinations combinations) 
{ 
    return (combinations & (Combinations.Type1CategoryB | Combinations.Type2CategoryB)) != 0; 
} 

Si quieres decir "exactamente uno de", solo usaría un switch o if etc.

+2

Si va a hacer esto, también sería una buena idea declarar 'Comisiones enum públicas: byte'. –

+0

Heh, +1 de mí por ser lo suficientemente rápido para obtener la respuesta y obtener 10 votos positivos antes de que haya publicado el mío :) – slugster

-2

Creo que esto, si he entendido bien la pregunta

if (combinations == Combinations.Type1CategoryB | Combinations.Type2CategoryB) 
+1

Eso no funcionará si la combinación es algo más que las dos posibilidades. assume combinaciones = Type1CategoryB | Tipo2CategoryB | Type2CategoryC. Entonces su cheque falla, que no es lo que se quiere. – Steffen

1

Para una manera más fácil de "marcar" los valores, es posible que desee comprobar Umbrella en CodePlex. Construyeron algunos métodos de extensión agradables y dulces para verificar los indicadores de bits en las enumeraciones. Sí, es una abstracción, pero creo que deberíamos centrarnos más en la legibilidad que en la implementación en sí misma.

Disfrútalo.