C#: Meilleur moyen de vérifier par rapport à un ensemble de Valeurs Enum?
supposons que vous avez
enum MyEnum {A = 0, B = 1, C = 2, D = 4, E = 8, F = 16};
À un certain point, vous avez une fonction qui va vérifier une instance de MyEnum et renvoie true si c'est C,D ou F
bool IsCDF(MyEnum enumValue)
{
return //something slick
}
Je me souviens qu'il y avait vraiment de la nappe de façon à faire le décalage de bits et de préformation de cette opération, que lire de façon mieux qu'un bouquet de ternaire si déclarations, mais pour la vie de moi je ne me souviens pas ce que c'est.
Ce que quelqu'un sait?
OriginalL'auteur George Mauer | 2011-09-19
Vous devez vous connecter pour publier un commentaire.
Si vous en faites une
[Flags]
enum, vous pouvez affecter une autre valeur de bit (1, 2, 4, 8, 16...) pour chaque valeur énumérée. Ensuite, vous pouvez utiliser une opération au niveau du bit pour déterminer si une valeur est un ensemble de valeurs possibles.Alors, pour voir si elle est C, D ou F:
ou à l'aide de
HasFlag()
(la moins efficace mais plus lisible):Notez que cela ne fonctionne pas pour une valeur de 0 (dans votre exemple, 'A'), et vous devez veiller à ce que toutes les valeurs de l'enum résoudre unique des valeurs des bits (c'est à dire non-zéro des puissances de deux).
Les avantages de cette approche sont:
Indication de la main:
Lors de la définition de [Drapeaux] enums, utilisez décalage vers la gauche (
<<
) afin de rendre les valeurs des bits plus clair (et beaucoup plus difficile de se tromper), surtout pour les plus élevés de bits d'ordre:Bien que, si la liste je suis de la vérification ne contient pas 0, alors il devrait toujours la valeur false toute façon...
Yep, je suis à 2 ans de retard - mais je ne vous le conseille, parce que c'est dangereux à long terme. Pas très lisible, pas très propre.
Oui, ces vous dit que vous pouvez utiliser Enum.HasFlag() qui est beaucoup plus lisible.
OriginalL'auteur Jason Williams
OriginalL'auteur Magnus
J'avais peut-être l'utiliser Sans Contrainte Mélodie comme un moyen de garder les choses en ordre:
Je serais probablement extraire le "C, D ou E" bit dans une constante nommée, peut - être sous l'enum lui-même, si elle avait un sens:
OriginalL'auteur Jon Skeet
Peut-être vous êtes la pensée de FlagsAttribute. Regardez ici et ici pour quelques exemples.
Vous pouvez utiliser Enum.HasFlag Méthode
Bienvenue sur la Pile d'Échange. C'est un les questions et réponses du site, pas une collection de liens. Veuillez inclure du contenu pertinent dans votre réponse, et pas seulement un lien à l'endroit où le contenu peut être. Le lien est agréable d'avoir en plus de la référence ou pour de plus amples informations. Pour plus de conseils, consultez réponse.
OriginalL'auteur CharithJ
Peut-être que cette classe d'extension est utile pour vous:
OriginalL'auteur Felix C
Ouais, c'est encore fondamentalement, si les déclarations, tout simplement pas Vrai/Faux
OriginalL'auteur Mark H