2016-08-18 1 views
-1
[ Flags ] 
public enum StatusType { a,b,c,d,e,f,g } 

StatusType m_StatusType = a | b; 

If (m_StatusType only contains a and b) // I need help here 
{ 

} 

안녕,C# 플래그 비교 내가 플래그를 비교에 도움이 필요 세트를

을 "만 포함". 플래그 열거 형 변수에 특정 값만 들어 있는지 어떻게 알 수 있습니까? 플래그 열거 형을 정의 할 때

+1

특정 문제를 명확히하거나 추가 세부 정보를 추가하여 강조 표시하십시오. 정확히 당신이 필요로하는 것. 현재 작성된 내용이므로 귀하가 원하는 내용을 정확하게 말하기는 어렵습니다. – Marusyk

+0

'(m_ StatusType & (a | b)) == a | b' –

+0

'[Flags]'를 사용하는 enum 유형에 대한 _thorough_ 토론 및 사용 방법은 duplicate를 참조하십시오. 남아있는 혼란으로 자신을 발견하면 문제가 무엇인지 분명하게 보여주는 좋은 [mcve]가 포함 된 새로운 질문을 게시하십시오. 코드가하는 일, 원하는 작업, 설명하는 데 어려움이있는 것을 설명하십시오. –

답변

1

우선, 각 플래그는 열거에 하나의 비트를 표현한다 :

CandD = 12, //has both c and d flags set. 

또는 경우를 :

enum X { a = 1, b = 2, c = 4, d = 8 } 

이것은 당신이뿐만 아니라 플래그를 결합 할 수 있습니다 그 중 많은 수가 있습니다 :

enum X { 
    a = 1 << 0, 
    b = 1 << 1, 
    c = 1 << 2, 
    d = 1 << 3, 
    ... 
    CAndD = c | d 
} 

간단한 동일성 비교를 사용하여 특정 플래그 만 테스트 할 수 있습니다 설정됩니다.

public bool ContainsOnly(X value, X flags) 
{ 
    return value == flags; 
} 

public bool ContainsOnlyCandD(X value) 
{ 
    return value == (X.c | X.d); 
} 

public bool ContainsBothCandDButCouldContainOtherStuffAsWell(X value) 
{ 
    return (value & (X.c | X.d)) == (X.c | X.d); 
} 
1

은 첫째, 당신의 플래그는 같은 만들어야합니다 :

[Flags] 
public enum StatusType 
{ 
    None = 0 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8, 
    E = 16, 
    F = 32, 
    G = 64 
} 

당신은 다음과 같은 할당 할 수

var statusType = StatusType.A | StatusType.B; 

을 그리고 같은 테스트 :

if (statusType.HasFlag(StatusType.A)) 
{ 
    //A is defined 
} 
+0

나는 OP의 이득 (및 어떤 미래 사람들)을 위해이 응답이 일하는 까 왜에 정성 들여 만들고 싶다. 이 열거 형 값 각각은 단일 1 만 포함하는 값을 할당 받고 나머지는 0입니다. '1 = 1, 2 = 01, 4 = 100, 8 = 1000, 16 = 10000 등. '|'는 비트 또는 연산자이고,'1 | 4 '는 이진수'101 '을 산출합니다. 그런 다음 비트와'&'를 사용하여 값을 비교할 수 있습니다. '101 & 10 = 000'이지만'101 & 100 = 100'입니다. 바라건대이 페이지에 다른 설명이 더 의미가 있습니다. – Cody

관련 문제