我喜欢这样的
[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
答案 0 :(得分:12)
你可以使用一点技巧:
Key key = Key.B | Key.C;
Key lowest = (Key)((int)key & -(int)key);
答案 1 :(得分:6)
Keys key = Keys.b | Keys.c;
var lowest = Enum.GetValues(typeof(Keys))
.Cast<Keys>()
.OrderBy(x => x)
.FirstOrDefault(x => key.HasFlag(x));
稍微高效一点的LINQ方法的.NET 4.0版本。
答案 2 :(得分: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);
答案 3 :(得分:0)
如果enum中只有3个值,那么最快和最简单的就是逐个检查它们。但是,对于一般解决方案,您可能希望尝试将k1
的值转换为整数,找到除以它的最大幂2并将其转换回Keys枚举值。
答案 4 :(得分:0)
答案 5 :(得分: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;
答案 6 :(得分:0)
您最初发布的代码没有意义:a + b + c没有以类型名称作为前缀,因此它们不会引用它们似乎要引用的枚举名称。
此外,如果使用按位AND组合标志,结果将包含所有参数中的所有标志 - 在本例中为none。