Reputation: 1202
Say I have the below enum
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
D = 8,
E = 16,
F = 32,
AB = A | B,
All = A | B | C,
}
If I have the variables:
var s = Letters.A | Letters.B | Letters.D;
var p = Letters.A | Letters.C | Letters.D | Letters.E;
What I want is to get the common values between these two enums so in this case it should be A | D
. Can some one please tell me how I can achieve this.
Thanks
Upvotes: 2
Views: 905
Reputation: 37070
Just as you use |
to get a union of values, you can use the &
to get the intersection:
var s = Letters.A | Letters.B | Letters.D;
var p = Letters.A | Letters.C | Letters.D | Letters.E;
var intersection = s & p; // A | D
var union = s | p; // All | D | E
Upvotes: 1
Reputation: 6232
If that's suitable for you it will return List of individual flags
static IEnumerable<Enum> GetFlags(Enum input)
{
foreach (Enum value in Enum.GetValues(input.GetType()))
if (input.HasFlag(value))
yield return value;
}
GetFlags(s).Intersect(GetFlags(p))
Upvotes: 0
Reputation: 2919
You can get that using the binary & (and) operator:
var s = Letters.A | Letters.B | Letters.D;
var p = Letters.A | Letters.C | Letters.D | Letters.E;
var sAndp = s & p; // This will give you only the common values ( A & D)
Upvotes: 10