C # Проверка, если перечисление Flags имеет только одно установленное значение - PullRequest
0 голосов
/ 29 мая 2019

У меня есть перечисление Flags, и я хочу утверждать, что данный его экземпляр является одним из примитивных значений, то есть в его двоичном представлении содержится ровно одна единица, т. Е. Степень двойки.

Какой лучший способ проверить это?

(я полагаю, что "лучший" не обязательно четко определен, так что ...)

  • Какой самый быстрый способ проверить это?
  • Какой самый семантически понятный способ проверить это?
  • Как это проверить, при написании минимального кода?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

битовая операция даст самый быстрый результат

((anInstanceOfTheFlaggedEnum & (anInstanceOfTheFlaggedEnum -1)) != 0)

по сравнению с более читаемой встроенной функцией

Enum.IsDefined(typeof(yourFlaggedEnumType), anInstanceOfTheFlaggedEnum)

Я только что выполнил тест, и он был в ~ 175 раз быстрее ..

0 голосов
/ 29 мая 2019

Используя функциональность Framework и будьте более гибкими в отношении количества установленных флагов, можно использовать что-то вроде:

[Flags] 
public enum FlagsEnum {
   None = 0,
   One = 1,
   Two = 2,
   Three = 4,
}

void Main()
{
    var flags = FlagsEnum.Two;
    var hasOneElement = Enum.GetValues(typeof(FlagsEnum)).OfType<FlagsEnum>().Where(i => i != FlagsEnum.None && flags.HasFlag(i)).Count() == 1;
}
...