C#:在按位枚举中获得最低值的键

Gjo*_*gji 1 c# enums bitwise-operators

我有这样的枚举

[Flags]
public enum Key
{
  None = 0,
  A = 1,
  B = 2,
  C = 4
}
Run Code Online (Sandbox Code Playgroud)

我有以下内容

Key k1 = Key.A | Key.B | Key.C;
Run Code Online (Sandbox Code Playgroud)

我想得到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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

你可以用一点技巧:

Key key = Key.B | Key.C;
Key lowest = (Key)((int)key & -(int)key);
Run Code Online (Sandbox Code Playgroud)

  • @David:我个人认为这几乎是不可读的.这是一个有趣的好奇但我希望没有人在生产代码中实际使用它!我更喜欢使用其中一种LINQ方法.如果有人确实使用了这个,我希望他们至少可以对它的作用进行解释. (2认同)
  • 是的,需要一点时间才能得到它,但我几乎可以向你保证它是最快的,而且非常简洁。这当然是可读性与效率的权衡。话虽这么说,我可能会放入类似的东西,然后忘记我后来做了什么。尽管如此,如果你只是谈论极客因素,那还是很酷的。 (2认同)

Mik*_*keP 6

Keys key = Keys.b | Keys.c;

var lowest = Enum.GetValues(typeof(Keys))
    .Cast<Keys>()
    .OrderBy(x => x)
    .FirstOrDefault(x => key.HasFlag(x));
Run Code Online (Sandbox Code Playgroud)

LINQ方法的效率和.NET 4.0版本略高一些.