Digamos que tengo esta enumeración:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
Para verificar si, por ejemplo, AB
está configurado, puedo hacer esto:
if((letter & Letters.AB) == Letters.AB)
¿Hay alguna manera más simple de verificar si alguna de las banderas de una constante de bandera combinada está establecida que la siguiente?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
¿Podría, por ejemplo, cambiar el &
por algo?
No es demasiado estable cuando se trata de cosas binarias como esta ...
Respuestas:
Si desea saber si la letra tiene alguna de las letras en AB, debe usar el operador AND &. Algo como:
fuente
letter & Letters.AB
. Editado eso allí.Letters.None
, ¿supongo que podría cambiar eso0
por un aspecto menos comparativo con el número mágico?En .NET 4 puede usar el método Enum.HasFlag :
El ejemplo muestra el siguiente resultado:
fuente
petsInFamily
tiene o unPet.Dog || Pet.Cat
?Utilizo métodos de extensión para escribir cosas así:
Aquí está el código:
fuente
where T : struct, IConvertible
. Gran código de lo contrario!IsFlagSet(this Enum value, Enum flag)
es suficiente.Hay un método HasFlag en .NET 4 o superior.
fuente
Si puede usar .NET 4 o superior que el método HasFlag ()
ejemplos
igual que
fuente
bitwise OR
hace "ambos deben estar configurados" y ninguno?bitwise OR
combinaría los valores, entonces 1000 | 0010 se convierte en 1010, o ambos conjuntosSi realmente te molesta, puedes escribir una función como esta:
fuente
return (value & flag) == flag;
no se compila: "Operador 'y' no se pueden aplicar a operandos de tipo 'T' y 'T'" .Esto verifica que tanto A como B estén configurados, e ignora si hay otros indicadores configurados.
Esto comprueba que o bien se fija A o B, e ignora si otros banderas se establecen o no.
Esto se puede simplificar para:
Aquí está la C para operaciones binarias; debería ser sencillo aplicar esto a C #:
Por cierto, el nombre de la variable en el ejemplo de la pregunta es la 'letra' singular, lo que podría implicar que representa solo una letra; el código de ejemplo deja en claro que es un conjunto de letras posibles y que se permiten múltiples valores, así que considere renombrar la variable 'letras'.
fuente
anything_and_a
,a_and_or_c_and_anything_else
yboth_ac_and_anything_else
siempre ser verdad? o me estoy perdiendo algo aquí?Qué tal si
?
fuente
Creé un método de extensión simple que no necesita verificar los
Enum
tipos:También funciona en enumeraciones anulables. El
HasFlag
método estándar no funciona, así que creé una extensión para cubrir eso también.Una prueba simple:
¡Disfrutar!
fuente
Aquí hay muchas respuestas, pero creo que la forma más idiomática de hacer esto con Flags sería Letters.AB.HasFlag (letra) o (Letters.A | Letters.B) .HasFlag (letra) si no lo hicieras ya tengo Letters.AB. letter.HasFlag (Letters.AB) solo funciona si tiene ambas.
fuente
Que este trabajo para usted?
Saludos,
Sebastiaan
fuente
Puede usar este método de extensión en la enumeración, para cualquier tipo de enumeración:
fuente
fuente
Simplemente puede verificar si el valor no es cero.
Pero consideraría una mejor solución introducir un nuevo valor de enumeración con valor cero y comparar de nuevo este valor de enumeración (si es posible porque debe poder modificar la enumeración).
ACTUALIZAR
No leí la pregunta: arreglé la primera sugerencia e ignore la segunda sugerencia.
fuente
Hay dos enfoques que puedo ver que funcionarían para verificar cualquier bit que se establezca.
Aproximación A
¡Esto funciona siempre y cuando no le importe comprobar todos los bits, incluidos los no definidos también!
Aproximación B
Esto solo verifica los bits definidos, siempre y cuando Letters. Todos represente todos los bits posibles.
Para bits específicos (uno o más conjuntos), use Aproach B reemplazando las letras. Todos con los bits que desea verificar (ver más abajo).
fuente
Lo siento, pero lo mostraré en VB :)
CntValue = 5 Entonces la enumeración contiene 1 + 4
fuente