Как вы можете видеть в документах mongo - поскольку индекс версии 3.2 $text
по умолчанию не чувствителен к регистру: https://docs.mongodb.com/manual/core/index-text/#text-index -фаза-нечувствительность
Создайте текстовый индекс и используйте текстовый оператор в вашем запросе .
В .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);
}
if((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
...
}
Я настроил дополнительный метод, чтобы сделать это: связанный вопрос .
В основном:
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
<час> Случайно соглашение, которое я использую для перечислений, исключительно для стандарта, множественного числа для флагов. Тем путем Вы знаете с перечислимого имени, может ли оно содержать несколько значений.
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
// Do something
}
(testItem & FlagTest.Flag1)
поразрядная операция И.
FlagTest.Flag1
эквивалентно 001
с перечислением OP. Теперь скажем, testItem
имеет Flag1 и Flag2 (таким образом, это поразрядное 101
):
001
&101
----
001 == FlagTest.Flag1
Попробуйте это:
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
// do something
}
В основном, Ваш код спрашивает, если установка обоих флагов совпадает с установкой одного флага, который является, очевидно, ложью. Код выше оставит только набор битов Flag1, если это будет установлено вообще, затем сравнит этот результат с Flag1. Для битовых операций необходимо использовать побитовые операторы.
Это должно добиться цели:
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
// Do something,
// however This is never true.
}
Редактирование: Фиксированный мой, если проверка - я снизился в свой C/C++ пути (благодаря Ryan Farley для указания на него)
Относительно редактирования. Вы не можете сделать его верным. Я предлагаю, чтобы Вы обернули то, что Вы хотите в другой класс (или дополнительный метод) стать ближе к синтаксису, в котором Вы нуждаетесь.
т.е.
public class FlagTestCompare
{
public static bool Compare(this FlagTest myFlag, FlagTest condition)
{
return ((myFlag & condition) == condition);
}
}
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
Еще один совет... Никогда не выполняйте стандартную бинарную проверку с флагом, значение которого равно "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);