Получение значения перечисления общих флагов в C#

Скажем, у меня есть перечисление ниже

[Flags]
enum Letters
{
     A = 1,
     B = 2,
     C = 4,
     D = 8,
     E = 16,
     F = 32,
     AB = A | B,
     All = A | B | C,
}

Если у меня есть переменные:

var s = Letters.A | Letters.B | Letters.D;
var p = Letters.A | Letters.C | Letters.D | Letters.E;

Я хочу получить общие значения между этими двумя перечислениями, так что в этом случае это должно быть A | D, Может кто-нибудь, пожалуйста, скажите мне, как я могу достичь этого.

Спасибо

4 ответа

Решение

Вы можете получить это, используя двоичный оператор & (и):

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)

Вот результат:

    var result =  s & p;

Так же, как вы используете | чтобы получить объединение ценностей, вы можете использовать & чтобы получить пересечение:

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

Если это подходит для вас, он вернет список отдельных флагов

 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))
Другие вопросы по тегам