Comment puis-je déterminer si une valeur Enum a une ou plusieurs des valeurs qu'il est en cours de comparaison avec?
Question
J'ai un Enum marqué avec l'attribut [Flags] comme suit:
[Flags]
public enum Tag : int
{
None = 0,
PrimaryNav = 1,
HideChildPages = 2,
HomePage = 4,
FooterLink = 8
}
sitemapnodes dans mon plan Sitemap je stocke la valeur int pour la combinaison de balises comme attribut.
Ce que je dois faire est de vérifier si un nœud a une d'un ou plusieurs balises, par exemple Tag.PrimaryNav | Tag.HomePage.
Je me bats avec la logique booléenne nécessaire pour déterminer si une valeur Enum a une ou plusieurs des valeurs qu'il est en cours de comparaison avec.
Toutes mes excuses si ce n'est pas claire. Je peux fournir plus d'informations si nécessaire.
La solution
Vous pouvez le faire en combinant les valeurs avec |
et la vérification par &
.
Pour vérifier si la valeur contient soit des tags:
if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... }
Le |
combine les énumérations que vous testez (et les) au niveau du bit tests &
par masquage de bits -. Si le résultat est zéro, il a au moins un d'entre eux set
Si vous voulez vérifier si elle a à la fois de les définir, vous pouvez le faire ainsi:
Tag desiredValue = Tag.PrimaryNav | Tag.HomePage;
if ((myValue & desiredValue) == desiredValue) { ... }
Ici, nous masquant tout ce que nous ne se soucient pas, et les tests de la valeur résultante est égale à ce que nous faire se soucient (nous ne pouvons pas utiliser != 0
comme avant parce que cela correspond < em> soit valeur et ici nous sommes intéressés à à la fois ).
Quelques liens:
Autres conseils
Vous pouvez utiliser la méthode hasFlag pour éviter la nécessité de la logique booléenne,
Tag Val = (Tag)9;
if (Val.HasFlag(Tag.PrimaryNav))
{
Console.WriteLine("Primary Nav");
}
if(Val.HasFlag(Tag.HomePage))
{
Console.WriteLine("Home Page");
}
Pour (Flags
) au niveau du bit énumérations, un "tout de" test est = 0, donc:
const Tag flagsToLookFor = Tag.PrimaryNav | Tag.HomePage;
if ((node.Tag & flagsToLookFor) != 0) {
// has some cross-over with PrimaryNav or HomePage (and possibly others too)
}
var someEnumValue = Tag.PrimaryNav | Tag.HomePage;
Pour tester si le ENUM contient une valeur donnée:
if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav)
{
}
var tag = Tag.HideChildPages | Tag.PrimaryNav;
If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) {
// Tag.PrimaryNav set.
}
Vous pouvez utiliser la bibliothèque de Jon Skeet Unconstrained Melody:
var someEnumValue = Tag.PrimaryNav | Tag.HideChildPages;
someEnumValue.HasAny(Tag.PrimaryNav | Tag.HomePage); // Returns true
Vous pouvez utiliser cette méthode d'extension sur ENUM, pour tout type de énumérations:
public static bool IsSingle(this Enum value)
{
var items = Enum.GetValues(value.GetType());
var counter = 0;
foreach (var item in items)
{
if (value.HasFlag((Enum)item))
{
counter++;
}
if (counter > 1)
{
return false;
}
}
return true;
}