Frage

Ich habe Enum wie diese

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

Ich habe folgende

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

Ich möchte den Schlüssel in k1 erhalten, die den niedrigsten Wert hat. Wie kann ich das tun?

Beispiel:

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
War es hilfreich?

Lösung

Keys key = Keys.b | Keys.c;

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

Ein wenig effiziente und .NET 4.0-ish Version der LINQ-Methode.

Andere Tipps

Sie können ein wenig Trick verwenden:

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

Wenn Sie nur 3 Werte im Enum haben wahrscheinlich die schnellste und einfachste ist es, sich eines nach dem anderen zu überprüfen. Für eine allgemeine Lösung ist jedoch, möchten Sie vielleicht versuchen, den Wert von k1 zu integer zu konvertieren, die größte Potenz von 2, dass teilt sie finden und wandeln es in Keys Enum-Wert zurück.

  1. Hier finden Sie eine Liste aller Werte in der Enum
  2. Karte, diese Werte zu einer Art vergleichbarer Datentyp
  3. Vergleichen Sie die Werte und Unterhalt Spur der niedrigste
  4. Konvertieren die niedrigste zurück in die Aufzählungstyp

Anforderungen eine iterative Implementierung sein, wo Sie Bits testen. Ich würde das so etwas wie tun.

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;

Der Code, den Sie ursprünglich geschrieben ist nicht sinnvoll: a. + B + c nicht durch eine Typname als Präfix, damit sie nicht auf die Enum-Namen beziehen sie scheinen beziehen werden soll

Auch wenn Sie eine bitweise AND-Flags zu kombinieren, wird das Ergebnis für alle Flaggen enthalten auf in alle paramters -. In diesem Fall keine

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top