2010-04-09 2 views
18

일부 정수 유형이 열거 형 멤버에 속하는지 확인하고 싶습니다. 예 정수 타입이 열거 형 멤버에 속하는지 확인하십시오.

,
public enum Enum1 
{ 
    member1 = 4, 

    member2 = 5, 

    member3 = 9, 

    member4 = 0 
} 

Enum1 E1 = (Enum1) 4 멤버 1

Enum1은 E2 = (Enum1) 10 내게 아무것도 제공하지 않고 그것을 확인하려는 날 준다.

+0

어쨌든 열거 형을 사용하는 목적을 모르십니까? 대신 사전을 사용할 수 있다면 시도하십시오 – Amsakanna

+0

무엇을 확인 하시겠습니까? – Ravia

+0

[유효성 검사 값 열거 형] 가능한 복제본 (http://stackoverflow.com/questions/13615/validate-enum-values) – bluish

답변

45

사용 Enum.IsDefined

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

하지만

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

속도가 필요한 경우 사용하지 마십시오 : Enum.IsDefined는 Reflection을 사용하며 ** 매우 * * 천천히. – ereOn

+6

첫째, 마이크로 최적화는 프로그래밍 작업의 낭비입니다. 둘째, 'Enum.IsDefined'는 밀리 초당 2,000 회 이상 실행됩니다. 나는 천천히 생각하지 않을 것이다. –

+0

ereOn, 어떻게하면 더 빨리 만들 수 있습니까? –

1

열거 형의 값을 살펴보고 정수와 비교하십시오.

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; 
    } 

편집는 : 샘이 better solution있다처럼 보인다.

3

Sam이 말한 것처럼 IsDefined를 사용할 수 있습니다. 그래도 다소 어색합니다. 당신은 는 당신에게 우리를 할 것이다 나의 Unconstrained Melody 도서관에서보고 할 수 있습니다 :

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

그것은 아마 하나 열거 통화 가치가 아니지만, 당신이 열거 형으로 물건을 많이하고 있다면 당신은 찾을 수 있습니다 거기에 유용한 것들.

Enum.IsDefinedbtw보다 빠릅니다. 그것은 단지 선형 스캔을 수행하지만 개선이 필요하면 알려주십시오 :) (대부분의 enum은 아마도 HashSet에서 이익을 얻지 못할 정도로 작지만 이진 검색을 할 수 있습니다 ...)

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