[C#] ¿Cómo comparar banderas en C #?


Answers

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

(testItem & FlagTest.Flag1) es una operación Y a nivel de bit.

FlagTest.Flag1 es equivalente a 001 con la enumeración de OP. Ahora digamos testItem tiene Flag1 y Flag2 (por lo que es bitwise 101 ):

  001
 &101
 ----
  001 == FlagTest.Flag1
Question

Tengo una enumeración de la bandera a continuación.

[Flags]
public enum FlagTest
{
    None = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4
}

No puedo hacer que la sentencia if se evalúe como verdadera.

FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;

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

¿Cómo puedo hacer esto verdad?




Prueba esto:


if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
    // do something
}
Básicamente, su código pregunta si tener ambas banderas configuradas es lo mismo que tener una bandera configurada, lo cual es obviamente falso. El código de arriba dejará solo el bit de Flag1 establecido si está configurado en absoluto, luego compara este resultado con Flag1.




Configuré un método de extensión para hacerlo: pregunta relacionada .

Básicamente:

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

Entonces puedes hacer:

FlagTests testItem = FlagTests.Flag1 | FlagTests.Flag2;

if( testItem.IsSet ( FlagTests.Flag1 ) )
    //Flag1 is set

Por cierto, la convención que uso para enumeraciones es singular para estándar, plural para banderas. De esta forma sabrá a partir del nombre enum si puede contener múltiples valores.




Un consejo más ... Nunca hagas la comprobación binaria estándar con la bandera cuyo valor es "0". Su cheque en esta bandera siempre será verdadero.

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

Si el parámetro de entrada de verificación binario contra FullInfo, obtiene:

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

bPRez siempre será cierto como NADA y 0 siempre == 0.

En su lugar, simplemente debe verificar que el valor de la entrada sea 0:

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



En cuanto a la edición. No puedes hacer que sea verdad. Te sugiero que envuelvas lo que quieras en otra clase (o método de extensión) para acercarte a la sintaxis que necesitas.

es decir

public class FlagTestCompare
{
    public static bool Compare(this FlagTest myFlag, FlagTest condition)
    {
         return ((myFlag & condition) == condition);
    }
}



Links