2

私はこのような列挙型を持っています

[Flags]
public enum Key
{
  None = 0,
  A = 1,
  B = 2,
  C = 4
}

私は次のものを持っています

Key k1 = Key.A | Key.B | Key.C;

最小値を持つ k1 のキーを取得したい。どうやってやるの?

例:

Key k1 = Key.A | Key.B | Key.C; // I want a 
Key k2 = Key.B | Key.C; // I want b
Key k3 = Key.A | Key.C; // I want a
4

7 に答える 7

13

ちょっとしたトリックを使用できます:

Key key = Key.B | Key.C;
Key lowest = (Key)((int)key & -(int)key);
于 2010-02-26T20:06:30.917 に答える
6
Keys key = Keys.b | Keys.c;

var lowest = Enum.GetValues(typeof(Keys))
    .Cast<Keys>()
    .OrderBy(x => x)
    .FirstOrDefault(x => key.HasFlag(x));

LINQメソッドの少し効率的で.NET4.0風のバージョン。

于 2010-02-26T20:26:31.717 に答える
4
Keys key = Keys.b | Keys.c;

var lowest = Enum.GetValues(typeof(Keys))
    .OfType<Keys>()
    .Where(x => (x & key) != 0)
    .OrderBy(x => x)
    .DefaultIfEmpty((Keys)0);

Console.WriteLine(lowest);
于 2010-02-26T20:06:17.220 に答える
0

列挙型に値が 3 つしかない場合、おそらく最も速くて簡単なのは、それらを 1 つずつチェックすることです。ただし、一般的な解決策として、値k1を整数に変換し、それを割る最大の 2 のべき乗を見つけて、キーの列挙値に変換し直すことをお勧めします。

于 2010-02-26T20:04:10.810 に答える
0
  1. 列挙型のすべての値のリストを取得します
  2. これらの値をある種の同等のデータ型にマップします
  3. すべての値を比較し、最も低い値を追跡します
  4. 最下位のものを列挙型に戻す
于 2010-02-26T20:04:32.150 に答える
0

ビットをテストする反復実装である必要があります。私はこのようなことをします。

unsigned int k = (unsigned int) k1;
int pos = -1;
while (k) {
   pos++;
   if (k & 0x1) break;
   k >>= 1;
}
Keys lowestKey = 0;
if (pos >= 0) lowestKey = 0x1 << pos;
于 2010-02-26T20:07:53.360 に答える
0

最初に投稿したコードは意味がありません: a+b+c は型名の前に付いていないため、参照することを意図していると思われる列挙名を参照しません。

また、ビットごとの AND を使用してフラグを結合すると、結果にはすべてのパラメーターですべてのフラグが含まれます(この場合はなし)。

于 2010-02-26T20:08:58.383 に答える