C #: Come più basso chiave valutato in un bit per bit Enum
-
23-09-2019 - |
Domanda
Ho enum come questo
[Flags]
public enum Key
{
None = 0,
A = 1,
B = 2,
C = 4
}
Ho il seguente
Key k1 = Key.A | Key.B | Key.C;
Voglio ottenere la chiave nel k1 che ha il valore più basso. Come posso fare?
Esempio:
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
Soluzione
Keys key = Keys.b | Keys.c;
var lowest = Enum.GetValues(typeof(Keys))
.Cast<Keys>()
.OrderBy(x => x)
.FirstOrDefault(x => key.HasFlag(x));
Un po 'più efficiente e la versione di .NET 4.0-ish del metodo LINQ.
Altri suggerimenti
È possibile utilizzare un po 'trucco:
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))
.OfType<Keys>()
.Where(x => (x & key) != 0)
.OrderBy(x => x)
.DefaultIfEmpty((Keys)0);
Console.WriteLine(lowest);
Se avete solo 3 valori nella enum probabilmente il più veloce e più facile è quello di controllare uno per uno. Per una soluzione generale, tuttavia, si potrebbe desiderare di provare a convertire il valore di k1
per intero, trovare la più grande potenza di 2 che lo divide e riconvertirlo in Keys valore enum.
- ottenere un elenco di tutti i valori nella enum
- Map quei valori a qualche tipo di tipo di dati comparabili
- Confronto tutti i valori e mantenere traccia di quello più basso
- Convertire il più basso uno indietro al tipo enum
deve essere un'implementazione iterativa in cui si prova bit. Vorrei fare qualcosa di simile.
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;
Il codice che originariamente pubblicato non ha senso:. A + b + c non sono preceduti da un nome-tipo, in modo da non fare riferimento ai nomi enum sembrano essere destinato a fare riferimento a
Inoltre, se si utilizza un bit AND per combinare le bandiere, il risultato conterrà tutte le bandiere su in tutti - paramters., In questo caso, nessuno