Допустим, у меня есть это перечисление:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
Чтобы проверить, установлен ли, например, AB
я могу сделать это:
if((letter & Letters.AB) == Letters.AB)
Есть ли более простой способ проверить, установлены ли какие-либо флаги объединенной постоянной флага, чем следующие?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
Не могли бы вы, например, поменяться &
с чем-то?
Не слишком стабильный, когда дело доходит до бинарных вещей вроде этого ...
Ответы:
Если вы хотите узнать, содержит ли буква какие-либо буквы в AB, вы должны использовать оператор AND &. Что-то вроде:
источник
letter & Letters.AB
. Отредактировал это там.Letters.None
, я предполагаю, что вы могли бы поменять это с0
менее похожим на магическое число?В .NET 4 вы можете использовать метод Enum.HasFlag :
В примере показан следующий вывод:
источник
petsInFamily
есть лиPet.Dog || Pet.Cat
?Я использую методы расширения для написания таких вещей:
Вот код:
источник
where T : struct, IConvertible
. Отличный код в противном случае!IsFlagSet(this Enum value, Enum flag)
достаточно.Есть метод HasFlag в .NET 4 или выше.
источник
Если вы можете использовать .NET 4 или выше, чем использовать метод HasFlag ()
Примеры
такой же как
источник
bitwise OR
делает это «оба должны быть установлены», а не любой?bitwise OR
будет объединять значения, поэтому 1000 | 0010 становится 1010, или оба установленыЕсли вас это действительно раздражает, вы можете написать такую функцию:
источник
return (value & flag) == flag;
не компилируется: «Оператор» & «не может быть применен к операндам типа« T »и« T »» .Это проверяет, что и A и B установлены, и игнорирует, установлены ли какие-либо другие флаги.
Это проверяет, установлен ли A или B, и игнорирует, установлены ли какие-либо другие флаги или нет.
Это может быть упрощено до:
Вот C для бинарных операций; должно быть просто применить это к C #:
Кстати, именование переменной в примере вопроса - это единственное «письмо», что может означать, что оно представляет только одну букву; код примера проясняет, что это набор возможных букв и что допускается несколько значений, поэтому рассмотрите возможность переименования переменной 'letters'.
источник
anything_and_a
,a_and_or_c_and_anything_else
иboth_ac_and_anything_else
всегда быть правдой? или я что-то здесь упускаю?Как насчет
?
источник
Я создал простой метод расширения, который не нуждается в проверке
Enum
типов:Он также работает со значениями nullable. Стандартного
HasFlag
метода нет, поэтому я создал расширение, чтобы охватить это тоже.Простой тест:
Наслаждайтесь!
источник
Здесь есть много ответов, но я думаю, что самый идиоматический способ сделать это с Flags - это Letters.AB.HasFlag (letter) или (Letters.A | Letters.B) .HasFlag (letter), если вы этого не сделали уже есть Letters.AB. letter.HasFlag (Letters.AB) работает, только если у него есть оба.
источник
Будет ли это работать для вас?
С Уважением,
Sebastiaan
источник
Вы можете использовать этот метод расширения для перечислений для любого типа перечислений:
источник
источник
Вы можете просто проверить, не равно ли значение нулю.
Но я бы посчитал лучшим решением ввести новое значение перечисления со значением ноль и снова сравнить это значение перечисления (если это возможно, потому что вы должны иметь возможность изменять перечисление).
ОБНОВИТЬ
Пропустил вопрос - исправил первое предложение и просто проигнорировал второе.
источник
Я вижу два подхода, которые сработали бы для проверки любого установленного бита.
Подход А
Это работает, если вы не против проверить все биты, в том числе и неопределенные!
Подход B
Это проверяет только определенные биты, пока Letters.All представляет все возможные биты.
Для определенных битов (один или несколько установленных) используйте Aproach B, заменив Letters.All битами, которые вы хотите проверить (см. Ниже).
источник
Извините, но я покажу это в VB :)
CntValue = 5 Итак, перечисление содержит 1 + 4
источник