2016-08-18 17 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_議論については、マークされた複製を参照してください。残っている混乱の中で自分を見つけた場合は、あなたが抱えている問題を明確に示す良い[mcve]を含む新しい質問を投稿してください。コードが何をしているのか、あなたが何をやりたいのか、そして何が問題なのかを具体的に説明してください。 –

答えて

1

まずオフフラグ列挙型を定義する際に、各フラグは列挙型で、単一のビットを表す必要があります。

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

これはあなたにもフラグを組み合わせることができます:

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

それともあれば

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つの1のみを含むバイナリ値が割り当てられ、残りは0です。 '1 = 1,2 = 01,4 = 100,8 = 1000,16 = 10000など。 '|'はビット単位または演算子で、 '1 | 4 'は2進数「101」を生成する。次に、ビット単位で '&'を使ってそれらを比較し、値が存在するかどうかを調べることができます。 '101&10 = 000'ではなく' 101&100 = 100'です。うまくいけば、このページの他の説明が意味をなさないでしょう。 – Cody