Получение значения перечисления общих флагов в 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 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))