201 votes

Comment supprimer un élément pour une énumération de OR?

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 puis-je supprimer la couleur bleue des couleurs variables?

366voto

SLaks Points 391154

Vous devez & avec les ~ (complément) de Blue .
Depuis ~Blue a chaque bit à l' exception de Blue , ce qui effacera le Blue bit ( 0 & x = 0 ) tout en laissant tous les autres bits inchangés ( 1 & x = 1 )

En d'autres termes:

 colors &= ~Blah.Blue;
 

52voto

par Points 4359

Les autres réponses sont correctes, mais pour supprimer spécifiquement le bleu de ce qui précède, vous écririez:

 colors &= ~Blah.BLUE;
 

9voto

Daniel A. White Points 91889

And not it ...............................

 Blah.RED | Blah.YELLOW == 
   (Blah.RED | Blah.BLUE | Blah.YELLOW) & ~Blah.BLUE;
 

7voto

Pensé que cela pourrait être utile pour d'autres personnes que suis tombé ici, comme moi.

Attention, 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 des bits.

Aussi quand vous avez les valeurs de l'enum qui sont des combinaisons d'autres puissance de 2 valeurs, par exemple

public enum Colour
{
    None = 0,  // default value
    RED = 2,
    BLUE = 4,
    GREEN = 8,
    YELLOW = 16,
    Orange = 18  // Combined value of RED and YELLOW
}

Dans ces cas, la méthode d'extension comme cela pourrait être utile:

public static Colour UnSet(this Colour states, Colour state)
{
    if ((int)states == 0)
        return states;

    if (states == state)
        return Colour.None;

    return states & ~state;
}

Et aussi l'équivalent IsSet méthode qui traite les valeurs combinées (quoique un peu à l'hacky façon)

public static bool IsSet(this Colour states, Colour state)
{
    // By default if not OR'd
    if (states == state)
        return true;

    // Combined: One or more bits need to be set
    if( state == Colour.Orange )
        return 0 != (int)(states & state);

    // Non-combined: all bits need to be set
    return (states & state) == state;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X