2010-04-09 17 views
18

Bazı tamsayı türlerinin (a) numaralandırma üyesine ait olduğunu kontrol etmek istiyorum. Örnek için Tamsayı türünün enum üyesine ait olduğunu kontrol edin

,
public enum Enum1 
{ 
    member1 = 4, 

    member2 = 5, 

    member3 = 9, 

    member4 = 0 
} 

Enum1 e1 = (Enum1) 4 member1

Enum1 e2 = (Enum1) 10 bana hiçbir verir ve bunu kontrol etmek istiyorum bana veriyor.

+0

Zaten bir enum kullanma amacınızı bilmiyorum. – Amsakanna

+0

yerine bir sözlük kullanıp kullanamayacağınızı deneyin. Ne kontrol etmek istersin? – Ravia

+0

[Geçerli Enum Değerlerini Doğrula] 'nın olası kopyası (http://stackoverflow.com/questions/13615/validate-enum-values) – bluish

cevap

45

Kullanım Enum.IsDefined

Enum.IsDefined(typeof(Enum1), 4) == true 

ama

Enum.IsDefined(typeof(Enum1), 1) == false 
+4

Hız gerektiren durumlarda bunu kullanmayın: Enum.IsDefined, Yansıma'yı kullanır ve ** çok * * Yavaş. – ereOn

+6

İlk olarak, mikro optimizasyon, programlama çabasının kaybıdır. İkincisi, "Enum.IsDefined", milisaniye başına 2000'den fazla kez çalışacaktır. Bunu yavaş düşünmezdim. –

+0

ereOn, Nasıl daha hızlı yapabilirim? –

1

Enum'un değerlerine bakar ve bunları tamsayı ile karşılaştırırsınız.

static bool EnumTest(int testVal, Enum e) 
    { 
     bool result = false; 
     foreach (var val in Enum.GetValues(typeof(Enum1))) 
     { 
      if ((int)val == testVal) 
      { 
       result = true; 
       break; 
      } 
     } 
     return result; 
    } 

Düzenleme: Sam better solution varmış gibi görünüyor.

3

Sam'in dediği gibi, IsDefined'i kullanabilirsiniz. Bu biraz garip olsa da. Sen size bize hangi benim Unconstrained Melody kütüphanede bakmak isteyebilirsiniz:

Enum1 e2 = (Enum1)10; 
if (e2.IsNamedValue()) // Will return false 
{ 
} 

Muhtemelen tek enum çağrı için değmez, ancak çeteleler ile bir sürü şey yapıyoruz eğer bulabilirsiniz Orada bazı yararlı şeyler.

Enum.IsDefined btw'den daha hızlı olmalıdır. Sadece şu anda lineer bir tarama yapar, ancak eğer geliştirilmeye ihtiyacınız varsa bana bildirin :) (Çoğu enumlar, HashSet'dan faydalanmayacak kadar küçüktür, ancak ikili bir arama yapabiliriz ...)

0
int testNum = 5; 
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum); 
İlgili konular