tags:

views:

188

answers:

7

I've got an Enum marked with the [Flags] attribute as follows:

[Flags]
public enum Tag : int
{
    None = 0,
    PrimaryNav = 1,
    HideChildPages = 2,
    HomePage = 4,
    FooterLink = 8
}

On sitemapnodes in my sitemap I store the int value for the tags combination as an attribute.

What I need to do is check if a node has any one of one or more tags, e.g. Tag.PrimaryNav | Tag.HomePage.

I'm struggling with the necessary boolean logic to determine if an Enum value has one or more of the values it's being compared with.

Apologies if this isn't clear. I can provide more information if necessary.

+1  A: 
var someEnumValue = Tag.PrimaryNav | Tag.HomePage;

To test if the enum contains a given value:

if ((someEnumValue & Tag.PrimaryNav) == Tag.PrimaryNav)
{

}
Darin Dimitrov
A: 
var tag = Tag.HideChildPages | Tag.PrimaryNav;

If ((tag & Tag.PrimaryNav) == Tag.PrimaryNav) {
    // Tag.PrimaryNav set.
}
Obalix
+8  A: 

You can do that by combining values with | and checking via &.

To check if the value contains either of the tags:

if ((myValue & (Tag.PrimaryNav | Tag.HomePage)) != 0) { ... }

The | combines the enums you're testing (bitwise) and the & tests via bitwise masking -- if the result isn't zero, it has at least one of them set.

If you want to test whether it has both of them set, you can do that as well:

Tag desiredValue = Tag.PrimaryNav | Tag.HomePage;
if ((myValue & desiredValue) == desiredValue) { ... }

Here we're masking off anything we don't care about, and testing that the resulting value equals what we do care about (we can't use != 0 like before because that would match either value and here we're interested in both).

Some links:

T.J. Crowder
Great answer, thanks a lot :)
Paul Suart
+2  A: 

For bitwise (Flags) enums, an "any of" test is != 0, so:

const Tag flagsToLookFor = Tag.PrimaryNav | Tag.HomePage;
if ((node.Tag & flagsToLookFor) != 0) {
    // has some cross-over with PrimaryNav or HomePage (and possibly others too) 
}
Marc Gravell
Likewise, this did the trick - thanks Marc.
Paul Suart
A: 

take a look here http://dotnetperls.com/enum-flags

serhio
+1  A: 

You can use the HasFlag Method to avoid the need for the boolean logic

        Tag Val = (Tag)9;

        if (Val.HasFlag(Tag.PrimaryNav))
        {
            Console.WriteLine("Primary Nav");
        }
        if(Val.HasFlag(Tag.HomePage))
        {
            Console.WriteLine("Home Page");
        }
rerun
This method is new in .NET 4.0, so it won't work if the OP is using an earlier version...
Thomas Levesque
yea then use any of the other methods list just wanted to throw it out there.
rerun
+1 A very good point.
T.J. Crowder
A: 

You could use Jon Skeet's Unconstrained Melody library:

var someEnumValue = Tag.PrimaryNav | Tag.HideChildPages;
someEnumValue.HasAny(Tag.PrimaryNav | Tag.HomePage); // Returns true
Ben Lings