10
votes

c # Enum exclure

Disons que j'ai un énum comme ceci: xxx pré>

et disons que j'ai une variable définie comme: p> xxx pré>

Comment faire Je découvre toutes les valeurs de notificationMethodType non définies dans la variable "Types"? En d'autres termes: P>

NotificationMethodType notAssigned = NotificationMethodType <that are not> types


0 commentaires

3 Réponses :


17
votes

Si la liste des types ne change jamais, vous pouvez le faire:

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


0 commentaires

4
votes

Un simple XOR fera le tour ...

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


1 commentaires

FWIW, XOR (les ^ opérateurs) et la réponse de Lasse 'et pas' sont mathématiquement la même chose.



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

3 commentaires

Waay moins efficace que l'une des 2 réponses qui utilisent des opérateurs bitwises


@ROBERT: Je ne peux pas nier que c'est moins efficace, mais son aptitude dépend vraiment de ce que les besoins de l'OP ont besoin. Votre propre réponse nécessite une valeur distincte toute la valeur à être maintenue en synchronisation avec la cauchemar d'entretien principal - un cauchemar de maintenance si cet Enum change jamais! (Et c'est bien davantage d'inconvénient, imo, qu'un problème d'efficacité supposé qui sera probablement jamais être remarqué dans la plupart des situations. Je suis évidemment moins libre et facile avec ma bowvoting que vous. )


convenu, tout devrait être défini dans le cadre de l'énum