2009-11-02 37 views
6

[Flags] ile işaretlenmiş bir enum varsa, .NET'in tek bir değer içerip içermediğini görmek için bu tür bir değeri sınamak için bir yol var mı? Bit sayımı kullanmak istediğim sonucu alabilirim, ancak mümkünse yerleşik işlevleri kullanmayı tercih ederim.Tek bir değer için [Bayraklar] enum değeri testi

enum değerlerini dinamik olarak döngülerken, Enum.GetValues(), kombinasyon bayraklarını da döndürür. Aşağıdaki örnekte enum üzerinde bu işlevi çağırmak 4 değeri döndürür. Ancak, iç algoritmada bulunan kombinasyonları değerini istemiyorum. enum, enum'un potansiyel olarak birçok değer içerebileceğinden ve enum'daki değerler değiştiğinde ek bakım gerektirdiğinden, eşitlik için bireysel enum değerlerini sınama.

[Flags] 
enum MyEnum 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Seven = One | Two | Four, 
} 

void MyFunction() 
{ 
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum))) 
    { 
     if (!_HasSingleValue(enumValue)) continue; 

     // Guaranteed that enumValue is either One, Two, or Four 
    } 
} 

private bool _HasSingleValue(MyEnum value) 
{ 
    // ??? 
}



İlgili: StackOverflow: Enum.IsDefined on combined flags

cevap

14

Sen int için döküm ve ikisinin bir güç olmadığını kontrol etmek Bit Twiddling Hacks den teknikleri kullanabilirsiniz.

int v = (int)enumValue; 
return v != 0 && (v & (v - 1)) == 0; 
+0

+1. Kesinlikle en şeffaf teknik olmasa da, kuşkusuz en basit olanıdır. –

0

Sen IsDefined bir arada kullanın ve 2.

+0

Yazdığım örnekte, 'IsDefined' her zaman 'true' değerini değerlendirirdi. –

-1

yetkileri kontrol edebilirsiniz Yapabilirsin sen Enum.GetValues ​​ve hiçbir kalanı 2 ile bölünebilen eşit 2 (bir güç yalnızca bu öğeleri saymak).

İlgili konular