Как сравнить флаги в C #?

Как вы можете видеть в документах mongo - поскольку индекс версии 3.2 $text по умолчанию не чувствителен к регистру: https://docs.mongodb.com/manual/core/index-text/#text-index -фаза-нечувствительность

Создайте текстовый индекс и используйте текстовый оператор в вашем запросе .

148
задан Keith 2 September 2008 в 18:39
поделиться

9 ответов

В .NET 4 есть новый метод Enum.HasFlag . Это позволяет вам написать:

if ( testItem.HasFlag( FlagTest.Flag1 ) )
{
    // Do Stuff
}

, что гораздо удобнее для чтения, IMO.

Источник .NET указывает, что это выполняет ту же логику, что и принятый ответ:

public Boolean HasFlag(Enum flag) {
    if (!this.GetType().IsEquivalentTo(flag.GetType())) {
        throw new ArgumentException(
            Environment.GetResourceString(
                "Argument_EnumTypeDoesNotMatch", 
                flag.GetType(), 
                this.GetType()));
    }

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue());
    // test predicate
    return ((uThis & uFlag) == uFlag); 
}
313
ответ дан 23 November 2019 в 22:21
поделиться
if((testItem & FlagTest.Flag1) == FlagTest.Flag1) 
{
...
}
7
ответ дан Damian 2 September 2008 в 18:39
поделиться

Я настроил дополнительный метод, чтобы сделать это: связанный вопрос .

В основном:

public static bool IsSet( this Enum input, Enum matchTo )
{
    return ( Convert.ToUInt32( input ) & Convert.ToUInt32( matchTo ) ) != 0;
}

Тогда можно сделать:

FlagTests testItem = FlagTests.Flag1 | FlagTests.Flag2;

if( testItem.IsSet ( FlagTests.Flag1 ) )
    //Flag1 is set
<час>

Случайно соглашение, которое я использую для перечислений, исключительно для стандарта, множественного числа для флагов. Тем путем Вы знаете с перечислимого имени, может ли оно содержать несколько значений.

21
ответ дан Community 2 September 2008 в 18:39
поделиться
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
     // Do something
}

(testItem & FlagTest.Flag1) поразрядная операция И.

FlagTest.Flag1 эквивалентно 001 с перечислением OP. Теперь скажем, testItem имеет Flag1 и Flag2 (таким образом, это поразрядное 101):

  001
 &101
 ----
  001 == FlagTest.Flag1
175
ответ дан Alexander Derck 2 September 2008 в 18:39
поделиться

Попробуйте это:


if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
    // do something
}
В основном, Ваш код спрашивает, если установка обоих флагов совпадает с установкой одного флага, который является, очевидно, ложью. Код выше оставит только набор битов Flag1, если это будет установлено вообще, затем сравнит этот результат с Flag1.
4
ответ дан OwenP 2 September 2008 в 18:39
поделиться

Для битовых операций необходимо использовать побитовые операторы.

Это должно добиться цели:

if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
    // Do something,
    // however This is never true.
}

Редактирование: Фиксированный мой, если проверка - я снизился в свой C/C++ пути (благодаря Ryan Farley для указания на него)

5
ответ дан 17 of 26 2 September 2008 в 18:39
поделиться

Относительно редактирования. Вы не можете сделать его верным. Я предлагаю, чтобы Вы обернули то, что Вы хотите в другой класс (или дополнительный метод) стать ближе к синтаксису, в котором Вы нуждаетесь.

т.е.

public class FlagTestCompare
{
    public static bool Compare(this FlagTest myFlag, FlagTest condition)
    {
         return ((myFlag & condition) == condition);
    }
}
5
ответ дан Keith 2 September 2008 в 18:39
поделиться

For those who have trouble visualizing what is happening with the accepted solution (то есть это),

if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
    // Do stuff.
}

testItem (согласно вопросу) определяется как,

testItem 
 = flag1 | flag2  
 = 001 | 010  
 = 011

Тогда в операторе if левая часть сравнения:

(testItem & flag1) 
 = (011 & 001) 
 = 001

И полный оператор if (который принимает значение true, если flag1 установлен в testItem ),

(testItem & flag1) == flag1
 = (001) == 001
 = true
78
ответ дан 23 November 2019 в 22:21
поделиться

Еще один совет... Никогда не выполняйте стандартную бинарную проверку с флагом, значение которого равно "0". Ваша проверка на этот флаг всегда будет истинной.

[Flags]
public enum LevelOfDetail
{
    [EnumMember(Value = "FullInfo")]
    FullInfo=0,
    [EnumMember(Value = "BusinessData")]
    BusinessData=1
}

Если вы выполните бинарную проверку входного параметра против FullInfo - вы получите:

detailLevel = LevelOfDetail.BusinessData;
bool bPRez = (detailLevel & LevelOfDetail.FullInfo) == LevelOfDetail.FullInfo;

bPRez всегда будет истинным, так как ЛЮБОЕ и 0 всегда == 0.


Вместо этого вы должны просто проверить, что значение входного параметра равно 0:

bool bPRez = (detailLevel == LevelOfDetail.FullInfo);
19
ответ дан 23 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: