Pregunta

Tengo enumeración como esto

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

Tengo el siguiente

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

Quiero conseguir la llave en k1 que tiene el valor más bajo. ¿Cómo puedo hacer eso?

Ejemplo:

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
¿Fue útil?

Solución

Keys key = Keys.b | Keys.c;

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

versión ligeramente más eficiente y .NET 4,0-ish del método LINQ.

Otros consejos

Se puede utilizar un truco poco:

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 usted tiene sólo 3 valores de la enumeración probablemente la más rápida y fácil es comprobar uno por uno. Para una solución general, sin embargo, es posible que desee para tratar de convertir el valor de k1 al número entero, encontrar la mayor potencia de 2 que divide y convertirlo de nuevo en el valor de enumeración Keys.

  1. Obtener una lista de todos los valores de la enum
  2. Mapa esos valores a algún tipo de tipo de datos comparable
  3. Comparar los valores y mantener realizar un seguimiento de la más baja
  4. Convertir la espalda baja hasta la tipo de enumeración

Es necesario que haya una implementación iterativo en el que prueba bits. Me gustaría hacer algo como esto.

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;

El código que Iniciado no tiene sentido:. A + b + c no llevan el prefijo de un nombre-tipo, para que no se refieren a los nombres de enumeración que parecen ser objeto hacer referencia a

Además, si se utiliza un bit a bit, y combinar las banderas, el resultado contendrá todas las banderas de en todos parametros -. En este caso, ninguno

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top