Comment faire pour supprimer un élément pour une OU souhaitez enum?
J'ai un enum comme:
public enum Blah
{
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16
}
Blah colors = Blah.RED | Blah.BLUE | Blah.YELLOW;
Comment pourrais-je enlever la couleur bleue de la variable couleurs?
- Petite note: un bit à bit enum en C# doit obtenir le [Drapeaux] attribut au-dessus d'elle.
- pourriez-vous expliquer pourquoi il devrait obtenir l'attribut?
- Il donne une meilleure prise en charge IntelliSense pendant le débogage, car il reconnaît inconnu valeurs enum comme des combinaisons de valeurs existantes.
- Il fournit également une plus significatives
.ToString()
valeur. par exemple,RED, BLUE, YELLOW
plutôt que22
.
Vous devez vous connecter pour publier un commentaire.
Vous devez
&
avec le~
(compléter) de "BLEU".L'opérateur de complément essentiellement inverse ou "flips" tous les bits pour le type de données. En tant que tel, si vous utilisez le
AND
opérateur (&
) avec une certaine valeur (appelons cette valeur 'X') et le complément d'un ou de plusieurs bits (appelons ces bitsQ
et leur complément~Q
), la déclarationX & ~Q
efface tous les bits qui ont été mis enQ
deX
et retourne le résultat.Donc à supprimer ou effacer l'
BLUE
bits, vous devez utiliser l'instruction suivante:Vous pouvez également spécifier plusieurs bits pour effacer, comme suit:
ou en alternance...
Donc, pour résumer:
X | Q
jeux de bit(s)Q
X & ~Q
efface le bit(s)Q
~X
flips/inverse tous les bits dansX
colors &= ~( Blah.BLUE | Blah.GREEN );
Les autres réponses sont correctes, mais précisément pour supprimer le bleu de la ci-dessus, on peut écrire:
And not
il...............................Pensé que cela pourrait être utile pour d'autres personnes que suis tombé ici, comme moi.
Être prudents dans la façon dont vous gérer toutes les valeurs de l'enum de ce que vous pourriez avoir une valeur == 0 (parfois, il peut être utile de demander à un Inconnu ou à l'état Inactif pour un enum). Il provoque des problèmes lors de l'utilisation de ces opérations de manipulation de bit.
Aussi quand vous avez les valeurs de l'enum qui sont des combinaisons d'autres puissance de 2 valeurs, par exemple
Dans ces cas, la méthode d'extension comme cela pourrait être utile:
Et aussi l'équivalent IsSet méthode qui traite les valeurs combinées (quoique un peu à l'hacky façon)
Red, Blue, Green
) plutôt que les valeurs sous-jacentes, ouais?none
ouunknown
ouunset
entrée avec la valeur == 0 est dans de nombreux cas, une bonne chose que vous ne pouvez pas toujours supposer qu'une valeur particulière est le jeu par défaut, par exemple si vous avez seulement le Rouge, le Bleu et le Vert sont que vous allez Rouge comme la valeur par défaut (par exemple, la valeur de l'enum a lors de sa création ou l'utilisateur n'a pas modifié?)1, 2, 4, 8
que vos valeurs? Si vous avez besoin d'une valeur par défaut, qui est ce que les constructeurs par défaut sont pour la, droite? Je tiens à garder les choses aussi explicites que possible, par souci de lisibilité, et en s'appuyant sur un enum pour défaut dedefault(int)
(0
) lorsqu'il n'est pas donné une valeur, en dépit d'être de l'information sans doute connu par n'importe quel développeur, est trop sournois pour mes goûts de toute façon. Edit: Ah, en fait, serait de faire Annuler = 0 empêcher quelque chose deUnset | Blue
?Red & ~Red
puis vous vous retrouvez avec zéro, vous devrez avoir le code pour vérifier cette affaire et affecter explicitement leUnset
valeur)states == 0
puisstates & ~state == states
votre première branche n'est pas nécessaire. De même, sistates == state
puisstates & ~state == Colour.None
ainsi, votre deuxième branche n'est pas nécessaire et vous pouvez simplement retournerstates & ~state
...Ce sujet xor(^)?
Étant donné que le DRAPEAU que vous tentez de supprimer est là, il va fonctionner.. si non, vous aurez à utiliser un &.
Vous pouvez utiliser ceci:
Pour simplifier le drapeau enum et de faire peut-être mieux de lire en évitant les multiples, nous pouvons utiliser le décalage de bits.
(À partir d'un bon article Se terminant le Grand Débat sur Enum Drapeaux)
et aussi pour effacer tous les bits