Question

Je ENUM comme ceci

[Flags]
public enum Key
{
  None = 0,
  A = 1,
  B = 2,
  C = 4
}

Je les

Key k1 = Key.A | Key.B | Key.C;

Je veux obtenir la clé k1 qui a la valeur la plus faible. Comment puis-je faire?

Exemple:

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
Était-ce utile?

La solution

Keys key = Keys.b | Keys.c;

var lowest = Enum.GetValues(typeof(Keys))
    .Cast<Keys>()
    .OrderBy(x => x)
    .FirstOrDefault(x => key.HasFlag(x));

version un peu plus efficace et .NET 4.0-ish de la méthode LINQ.

Autres conseils

Vous pouvez utiliser une astuce bits:

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);

Si vous avez seulement trois valeurs dans le ENUM probablement le plus rapide et le plus facile est de les vérifier un par un. Pour une solution générale, cependant, vous voudrez peut-être essayer de convertir la valeur de k1 à entier, trouver la plus grande puissance de 2 qui divise et reconvertir en clés valeur ENUM.

  1. Obtenir une liste de toutes les valeurs de la ENUM
  2. corréler ces valeurs à une sorte de type de données comparables
  3. Comparer toutes les valeurs et garder trace de celui le plus bas
  4. Convertir une plus faible retour à la type ENUM

a besoin d'être une implémentation itérative où vous testez les bits. Je ferais quelque chose comme ça.

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;

Le code Envoyé n'a pas de sens. A + b + c ne sont pas préfixés par un type nom, afin qu'ils ne se référer aux noms de ENUM ils semblent être destinés à se référer à

En outre, si vous utilisez un niveau du bit de combiner des drapeaux, le résultat contiendra tous les drapeaux sur tous - paramters. Dans ce cas, aucun

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top