2009-12-21 20 views
5

Vorrei trovare un modo per verificare se un insieme di valori è contenuto nella mia variabile.Impostare in enum per C#

[Flags] 
public enum Combinations 
{ 
    Type1CategoryA = 0x01,  // 00000001 
    Type1CategoryB = 0x02,  // 00000010 
    Type1CategoryC = 0x04,  // 00000100 
    Type2CategoryA = 0x08,  // 00001000 
    Type2CategoryB = 0x10,  // 00010000 
    Type2CategoryC = 0x20,  // 00100000 
    Type3 = 0x40    // 01000000 
} 

bool CheckForCategoryB(byte combinations) 
{ 

    // This is where I am making up syntax 

    if (combinations in [Combinations.Type1CategoryB, Combinations.Type2CategoryB]) 
     return true; 
    return false; 

    // End made up syntax 
} 

Sono un trapianto in .NET di Delphi. Questo è un codice abbastanza facile da scrivere in Delphi, ma non sono sicuro di come farlo in C#.

risposta

16

Se vuoi dire "almeno una delle bandiere":

return (combinations 
    & (byte)(Combinations.Type1CategoryB | Combinations.Type2CategoryB)) != 0; 

anche - se si dichiara come Combinations combinations (piuttosto che byte), è possibile eliminare la (byte)

bool CheckForCategoryC(Combinations combinations) 
{ 
    return (combinations & (Combinations.Type1CategoryB | Combinations.Type2CategoryB)) != 0; 
} 

Se vuoi dire "esattamente uno di", vorrei solo usare un switch o if ecc.

+2

Se avete intenzione di fare questo, sarebbe anche una buona idea dichiarare "public enum Combinations: byte'. –

+0

Heh, +1 da parte mia per essere abbastanza veloce da ottenere sia la risposta che ottenere 10 upvotes prima di pubblicare il mio :) – slugster

-2

Penso che questo, se ho capito correttamente alla domanda

if (combinations == Combinations.Type1CategoryB | Combinations.Type2CategoryB) 
+1

Questo non funzionerà se la combinazione è nient'altro oltre alle due possibilità. assume combinazioni = Tipo1CategoriaB | Type2CategoryB | Type2CategoryC. Quindi il tuo assegno fallisce, che non è ciò che desideri. – Steffen

1

Per un modo più semplice per "check" quelli di valore, si potrebbe voler controllare Umbrella su CodePlex. Hanno creato alcuni metodi di estensione piacevoli e dolci per verificare i bit flag sull'enumerazione. Sì, è un'astrazione, ma penso che dovremmo concentrarci maggiormente sulla leggibilità rispetto all'implementazione stessa.

Divertiti.