0

次のような状況があります。

得たenum

enum MyType{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4,
    //and so on 
}

たとえば、指定された数値がバイナリの合計の結果であるかどうかを確認したくありません

int givenNumber = 3;
int result = 
//how to get that it's sum of 2 enums in this particular case would be (int)Type.First & (int)Type.Second == 3;

私の質問が十分に明確であり、誰かがこれを手伝ってくれることを願っています.

編集

  1. enum 値は常に 2 で駆動されます

  2. 指定された数値が異なるバイナリ合計の 1 つの例である可能性があることを確認するメソッドを作成したいと思います。int givenNumber = 1; //1 , 3 ,5 and 7 will be the answer

  3. 実生活のサンプル: データベースに請負業者があり、すべての請負業者はプロデューサー = 1、サプライヤー = 2、サービス = 4 である場合があります。この場合、int 値を 1 つだけ格納できるのが最も賢明な選択です。Service - Contractors のコンボボックスにアイテムをロードするとき、たとえば値 4 または 5 または 7 を持つすべての行をロードします (7 = 1+2+4、5 = 1+4 および 4=4 のため)。

私の質問はより明確になりましたか?

4

4 に答える 4

5

次のように個々の列挙型を取得できます。

static IEnumerable<MyEnum> GetFlags(this MyEnum e)
{
    var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
    foreach (var flag in flags)
        if ((flag & e) > 0) yield return flag;
}

次に、次のように使用できます。

int givenNumber = 3;
var results = ((MyEnum)givenNumber).GetFlags();
于 2013-02-08T13:22:41.327 に答える
1
private enum YourType
{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4,
}

private static void Main(string[] args)
{
    int givenNumber = 3;
    YourType castedNumber = (YourType)givenNumber;

    if ((castedNumber & YourType.First) == YourType.First)
    {
        Console.WriteLine("First");
    }

    if ((castedNumber & YourType.Second) == YourType.Second)
    {
        Console.WriteLine("Second");
    }

    if ((castedNumber & YourType.Third) == YourType.Third)
    {
        Console.WriteLine("Third");
    }

    Console.Read();
}

次のことに注意してください。

  1. これはNone(0) 値では機能しないため、手動で 0 を確認する必要があります ((x & 0)常に 0 です)。
  2. すべての値は 2 の累乗でなければなりません
  3. 属性を追加して、[Flag]他の開発者が列挙型をビット演算で使用できるようにすることをお勧めします。
于 2013-02-08T13:11:34.030 に答える
0
    enum Flag
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        Fourth = 8
    }

    static void Main(string[] args)
    {
        int givenNumber = 3;
        List<Flag> flags = new List<Flag>();

        int number, result;
        do
        {
            int step = 0;
            do
            {
                number = (int)Math.Pow(2d, ++step);
            } while (number < givenNumber);
            result = (int)Math.Pow(2d, step - 1);
            flags.Add((Flag)result);
            givenNumber -= result;
        } while (givenNumber != 0);

        Debugger.Break();
    }
于 2013-02-08T13:35:16.937 に答える
0
[Flags]
enum MyType{
  None = 0,
  First = 1,
  Second = 2,
  Third = 4,
  //and so on 
}

Flags 属性を使用すると、単純な toString でドロップダウンに必要なものが得られることを意味します

すなわち

MyType test = (MyType)6;
Console.WriteLine(test.ToString());

印刷されます:

Second, Third

6の代わりに

于 2013-02-08T13:54:37.970 に答える