列挙型と列挙型からの値のリストを使用し、ビット単位を使用して列挙型から値のリストの整数を取得する別の言語のコードがあります。
HELLO = 1
WORLD = 2
AND = 4
SO = 8
ON = 16
したがって、リストに HELLO と SO がある場合、値が返されます
1 | 1000 = 1001
1001bin to dec = 9
この整数を取得し、含まれている列挙型のリストを返す最も効率的な方法を見つけようとしています。
列挙型と列挙型からの値のリストを使用し、ビット単位を使用して列挙型から値のリストの整数を取得する別の言語のコードがあります。
HELLO = 1
WORLD = 2
AND = 4
SO = 8
ON = 16
したがって、リストに HELLO と SO がある場合、値が返されます
1 | 1000 = 1001
1001bin to dec = 9
この整数を取得し、含まれている列挙型のリストを返す最も効率的な方法を見つけようとしています。
列挙型を直接操作する場合、すべての列挙型の基本型は整数です。この知識があれば、整数の「無制限」の性質を利用して、列挙型の利点を取り入れることができます。
enum Greetings {
HELLO = 1,
WORLD = 2,
AND = 4,
SO = 8,
ON = 16
}
したがって、呼び出し先から整数が返された場合 (interop を実行していますか?)、次のようにすることができます。
Greetings greet = (Greetings)theIntegerResult;
そこから、ビットごとの操作を実行して、どのフィールドが設定されているかを確認できます。
bool isHelloSet = (greet & Greetings.HELLO) == Greetings.HELLO;
bool isWorldSet = (greet & Greetings.WORLD) == Greetings.WORLD;
bool isAndSet = (greet & Greetings.AND) == Greetings.AND;
bool isSoSet = (greet & Greetings.SO) == Greetings.SO;
bool isOnSet = (greet & Greetings.ON) == Greetings.ON;
C# ではEnum.HasFlag(v)
. 列挙型に値v
が設定されている場合に返されます。
MSDN のドキュメントを参照してください