C #: Conseguir más bajo llave valorada en un bit a bit Enum
-
23-09-2019 - |
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
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.
- Obtener una lista de todos los valores de la enum
- Mapa esos valores a algún tipo de tipo de datos comparable
- Comparar los valores y mantener realizar un seguimiento de la más baja
- 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