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));

更高效的 .NET 4.0-ish 版本的 LINQ 方法。

于 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 个值,可能最快和最简单的方法是逐个检查它们。但是,对于一般解决方案,您可能希望尝试将 的值转换k1为整数,找到除以它的 2 的最大幂并将其转换回 Keys 枚举值。

于 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 回答