2

フラグが立てられた列挙の逆を生成しようとしています。以下は列挙型です:

[Flags]
public enum MyType
{
  Unknown = 0,
  A = 1 << 0,
  B = 1 << 2,
  C = 1 << 3,
  D = 1 << 4,
  E = 1 << 5,
  F = 1 << 6
}

MyType mtGroup1値が。のスタティックを定義しました(A | B)。を除いて、これの逆を生成したいと思いUnknownます。

私の解決策:

MyType t = MyType.Unknown;
foreach (var vType in Enum.GetValues(typeof(MyType)).OfType<MyType>())
{
    if ((mtGroup1 & vType) != vType)
         t = t | vType;   //Consolidates into a single enum, excluding unknown
}

結果の値tは、でありC | D | E | F、これは望ましい結果です。この方法は機能しますが、LINQを使用して上記のように統合するより簡単な方法があることを望んでいました(他の、より簡単な場合は非LINQの方法も受け入れられます)。

ありがとう!

4

1 に答える 1

2

私のUnconstrainedMelodyプロジェクトは、これを本当に簡単にします。

MyType inverse = mtGroup1.UsedBitsInverse();

プロジェクトには、ジェネリック型パラメーターを列挙型またはデリゲート。このように、上記のコードはボクシングなしで機能します。実際には、列挙型のすべての「興味深い」ビットを1回実行します。これは、その型がUnconstrained Melodyと組み合わせて初めて使用されるため、この操作は非常に効率的です。 。

Unconstrained Melodyを使用したくない場合は、列挙型の「使用済みビット」を1回検索する独自のメソッドを作成してから、次を使用することができます。

MyType t = UsedBitsOfMyType & ~mtGroup1;
于 2012-07-26T21:39:47.957 に答える