![](/img/trans.png)
[英]How do I test if a bitwise enum contains any values from another bitwise enum in C#?
[英]C#: Getting lowest valued key in a bitwise Enum
我有這樣的枚舉
[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
您可以使用一些技巧:
Key key = Key.B | Key.C;
Key lowest = (Key)((int)key & -(int)key);
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。
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個值,那么最快和最簡單的方法就是一一檢查。 但是,對於一般解決方案,您可能想要嘗試將k1
的值轉換為整數,找到將2除以2的最大冪並將其轉換回Keys枚舉值。
需要是測試位的迭代實現。 我會做這樣的事情。
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;
您最初發布的代碼沒有意義:a + b + c不會以類型名作為前綴,因此它們不會引用似乎打算引用的枚舉名稱。
同樣,如果您使用按位AND來組合標志,則結果將包含所有參數中的所有標志-在這種情況下,沒有標志。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.