10 votes

c# enum exclude

Disons que j'ai un enum comme celui-ci :

[Flags]
public enum NotificationMethodType {
    Email = 1,
    Fax = 2,
    Sms = 4
}

Et disons que j'ai une variable définie comme :

NotificationMethodType types = (NotificationMethodType.Email | NotificationMethodType.Fax)

Comment puis-je déterminer toutes les valeurs de NotificationMethodType qui ne sont pas définies dans la variable "types" ? En d'autres termes :

NotificationMethodType notAssigned = NotificationMethodType <that are not> types

17voto

Lasse V. Karlsen Points 148037

Si la liste des types ne change jamais, vous pouvez procéder ainsi :

NotificationMethodType allTypes = NotificationMethodType.Email |
    NotificationMethodType.Fax |
    NotificationMethodType.Sms;

NotificationMethodType notAssigned = allTypes & ~types;

Le ~ crée une valeur inverse, en inversant tous les bits.

Une façon typique de définir de tels enums pour au moins garder la définition de "allTypes" locale à l'enum serait d'inclure deux nouveaux noms dans l'enum :

[Flags]
public enum NotificationMethodType {
    None = 0,
    Email = 1,
    Fax = 2,
    Sms = 4,
    All = Email | Fax | Sms
}

Note : Si vous choisissez d'ajouter le All à l'enum, notez que si types était vide, vous n'obtiendriez pas un enum qui serait imprimer comme "Email, Fax, Sms", mais plutôt comme "Tous".

Si vous ne voulez pas maintenir manuellement la liste des allTypes vous pouvez le faire en utilisant l'option Enum.GetValues méthode :

NotificationMethodType allTypes = 0;
foreach (NotificationMethodType type in Enum.GetValues(typeof(NotificationMethodType)))
    allTypes |= type;

ou vous pouvez faire la même chose avec LINQ :

NotificationMethodType allTypes = 
    Enum.GetValues(typeof(NotificationMethodType))
    .Cast<NotificationMethodType>()
    .Aggregate ((current, value) => current | value);

Cela permet de construire le allType en faisant un OU entre toutes les valeurs individuelles de l'enum.

4voto

Robert Levy Points 18154

Un simple XOR fera l'affaire...

NotificationMethodType all = (NotificationMethodType.Email | NotificationMethodType.Fax | NotificationMethodType.Sms);
NotificationMethodType used = (NotificationMethodType.Email | NotificationMethodType.Fax);
NotificationMethodType unused = (all ^ used);

Pour rendre cela un peu plus propre, ajoutez directement la valeur All à votre définition d'enum (en fixant évidemment la valeur à 7). De cette façon, vous pouvez ajouter des choses à l'énumération plus tard sans casser ce code.

1voto

LukeH Points 110965
var notAssigned = Enum.GetValues(typeof(NotificationMethodType))
                      .Cast<NotificationMethodType>()
                      .Where(x => !types.HasFlag(x))
                      .Aggregate((a, x) => a | x);

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