簡體   English   中英

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枚舉值。

  1. 獲取枚舉中所有值的列表
  2. 將這些值映射到某種可比較的數據類型
  3. 比較所有值並跟蹤最低的值
  4. 將最低的一個轉換回枚舉類型

需要是測試位的迭代實現。 我會做這樣的事情。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM