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
È stato utile?

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.

  1. ottenere un elenco di tutti i valori nella enum
  2. Map quei valori a qualche tipo di tipo di dati comparabili
  3. Confronto tutti i valori e mantenere traccia di quello più basso
  4. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top