Nehmen wir an, ich habe diese Aufzählung:
[Flags]
enum Letters
{
A = 1,
B = 2,
C = 4,
AB = A | B,
All = A | B | C,
}
Um zu überprüfen, ob zum Beispiel gesetzt AB
ist, kann ich dies tun:
if((letter & Letters.AB) == Letters.AB)
Gibt es eine einfachere Möglichkeit zu überprüfen, ob eines der Flags einer kombinierten Flag-Konstante gesetzt ist als die folgenden?
if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
Könnten Sie zum Beispiel das &
mit etwas tauschen ?
Nicht zu stabil, wenn es um solche binären Dinge geht ...
Antworten:
Wenn Sie wissen möchten, ob der Buchstabe einen der Buchstaben in AB enthält, müssen Sie den Operator AND & verwenden. Etwas wie:
quelle
letter & Letters.AB
. Habe das da drin bearbeitet.Letters.None
, nehme ich an, dass Sie das mit dem0
für einen weniger mit Magie vergleichbaren Look tauschen könnten ?In .NET 4 können Sie die Enum.HasFlag-Methode verwenden :
Das Beispiel zeigt die folgende Ausgabe:
quelle
petsInFamily
hat entweder einePet.Dog || Pet.Cat
?Ich benutze Erweiterungsmethoden, um solche Dinge zu schreiben:
Hier ist der Code:
quelle
where T : struct, IConvertible
. Ansonsten toller Code!IsFlagSet(this Enum value, Enum flag)
ist ausreichend.In .NET 4 oder höher gibt es die HasFlag- Methode.
quelle
Wenn Sie .NET 4 oder höher als die HasFlag () -Methode verwenden können
Beispiele
gleich wie
quelle
bitwise OR
dass es "beide müssen gesetzt sein" und keine?bitwise OR
würde die Werte kombinieren, also 1000 | 0010 wird 1010 oder beide setzenWenn es Sie wirklich nervt, können Sie eine Funktion wie diese schreiben:
quelle
return (value & flag) == flag;
wird nicht kompiliert: "Operator '&' kann nicht auf Operanden vom Typ 'T' und 'T' angewendet werden" .Dies prüft, ob sowohl A als auch B gesetzt sind, und ignoriert, ob andere Flags gesetzt sind.
Dies überprüft, ob entweder A oder B gesetzt ist, und ignoriert, ob andere Flags gesetzt sind oder nicht.
Dies kann vereinfacht werden zu:
Hier ist das C für binäre Operationen; Es sollte einfach sein, dies auf C # anzuwenden:
Übrigens ist die Benennung der Variablen im Beispiel der Frage der singuläre "Buchstabe", was bedeuten könnte, dass sie nur einen einzelnen Buchstaben darstellt; Der Beispielcode macht deutlich, dass es sich um eine Reihe möglicher Buchstaben handelt und dass mehrere Werte zulässig sind. Erwägen Sie daher, die Variable 'Buchstaben' umzubenennen.
quelle
anything_and_a
,a_and_or_c_and_anything_else
undboth_ac_and_anything_else
immer wahr sein? oder fehlt mir hier etwasWie wäre es mit
?
quelle
Ich habe eine einfache Erweiterungsmethode erstellt, bei der keine
Enum
Typen überprüft werden müssen:Es funktioniert auch mit nullbaren Aufzählungen. Die Standardmethode
HasFlag
funktioniert nicht, daher habe ich eine Erweiterung erstellt, um dies ebenfalls abzudecken.Ein einfacher Test:
Genießen!
quelle
Hier gibt es viele Antworten, aber ich denke, der idiomatischste Weg, dies mit Flags zu tun, wäre Letters.AB.HasFlag (Buchstabe) oder (Letters.A | Letters.B) .HasFlag (Buchstabe), wenn Sie dies nicht tun habe bereits Letters.AB. letter.HasFlag (Letters.AB) funktioniert nur, wenn beide vorhanden sind.
quelle
Würde das für dich funktionieren?
Grüße,
Sebastiaan
quelle
Sie können diese Erweiterungsmethode für Aufzählungen für jede Art von Aufzählungen verwenden:
quelle
quelle
Sie können einfach überprüfen, ob der Wert nicht Null ist.
Ich würde es jedoch für eine bessere Lösung halten, einen neuen Aufzählungswert mit dem Wert Null einzuführen und diesen Aufzählungswert erneut zu vergleichen (wenn möglich, da Sie in der Lage sein müssen, die Aufzählung zu ändern).
AKTUALISIEREN
Die Frage falsch gelesen - den ersten Vorschlag korrigiert und den zweiten Vorschlag einfach ignoriert.
quelle
Es gibt zwei Ansätze, die ich sehen kann, um zu überprüfen, ob ein Bit gesetzt ist.
Ansatz A.
Dies funktioniert so lange, wie es Ihnen nichts ausmacht, nach allen Bits zu suchen, auch nach nicht definierten!
Ansatz B.
Dies überprüft nur die definierten Bits, solange Letters.All alle möglichen Bits darstellt.
Verwenden Sie für bestimmte Bits (ein oder mehrere Sätze) Ansatz B, um Buchstaben zu ersetzen. Alle durch die Bits, auf die Sie prüfen möchten (siehe unten).
quelle
Sorry, aber ich werde es in VB zeigen :)
CntValue = 5 Die Aufzählung enthält also 1 + 4
quelle