Laden...

Entscheidungen mit enums verkürzen

Erstellt von thepaul vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.536 Views
T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 15 Jahren
Entscheidungen mit enums verkürzen

Hi,

warscheinlch ist das ganze einfach, habe aber trotzSuche nichts zum Thema gefunden.

Angenommen ich habe eine Variable einer Enumeration (TestEnum a = TestEnum.ABC).
Jetzte möchte ich mit die Entscheidung treffen, ob a zu einer bestimmten Gruppe von Enumerationswerten dazugehört. Z.B.:


//b = true;
bool b =  (a == TestEnum.ABC || a == TestEnum.DEF || a == TestEnum.GHI);

//b = false;
bool b =  (a == TestEnum.DEF || a == TestEnum.GHI || a == TestEnum.JKL);

Gibt es eine Möglichkeit die Abfrage zu verkürzen (logische Operatoren?!) oder eine einfachere Möglichkeit zur Prüfung ob eine Variable zu einer Menge von Enumerationswerten dazugehört?

Vielen Dank.

467 Beiträge seit 2007
vor 15 Jahren

wenn du das oft brauchst, kannst du es in eine Funktion packen. Sonst glaube ich nicht, dass noch etwas geht. Du kannst versuchen die Enumwerte in int zu konvertieren, und prüfen, ob der Wert innerhalb der Granzwerte(konvertierte enum-Werte) liegt. Ob das so toll ist kann ich nicht sagen-.
SO:

        enum Alphapet { ABC = 0, DEF = 1, GHI = 2, JKL = 3, MNO = 4, PQR = 5, STU = 6, VWX = 7, YZ = 8 }
            Alphapet a= Alphapet.ABC;

if ((int)a >= (int)Alphapet.ABC && (int)a <= (int)Alphapet.GHI)
                Console.WriteLine("Ja");//mach was
            else
                Console.WriteLine("Nein");
S
142 Beiträge seit 2007
vor 15 Jahren

Hallo thepaul,

Du könntest die Enums logisch in Listen oder Arrays zusammenfassen und dann mit .Contains(..) arbeiten.

mfg Steav

Gelöschter Account
vor 15 Jahren

dazu verwendet man flag-enumeratoren. dann geht das supereinfach.

das geht dann so:

(a == TestEnum.ABC | a == TestEnum.DEF | a == TestEnum.GHI);
T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 15 Jahren

Danke euch allen.

Flags waren das was ich gesucht habe 🙂

467 Beiträge seit 2007
vor 15 Jahren

ich verstehe den Unterschied zwischen | und || nicht ganz. Ein Strich und 2Striche, aber sonst doch genau die gleiche Abfrage, oder habe ich was übersehen? Ich arbeite recht gern mit enums, desshalb wüsste ich das auch gerne.

T
thepaul Themenstarter:in
151 Beiträge seit 2005
vor 15 Jahren

das gibt ergibt noch andere Möglichkeiten


TestEnum a = TestEnum.ABC;
TestEnum b = TestEnum.ABC | TestEnum.DEF | TestEnum.GHI;
				
bool c = (a & b) > 0;

In b sind alle aktzeptierten Werte gespeichert. Ob a einen Wert aus b enthält lässt sich einfach prüfen.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo ANSI_code,

vom Grundsatz her ist | ist bitweises ODER und || ist logisches ODER.

| kann aber auch ein logisches ODER sein und zwar dann, wenn seine Operanden beide bools sind. Der Unterschied zwischen dem logischen | und dem logischen || ist, dass beim ersten immer beide Operanden ausgewertet werden und erst dann das Ergebnis des ODERs ermittelt wird, wogegen beim zweiten der zweite Operand nicht ausgewertet wird, wenn schon der erste true ist. Das hat Performance-Vorteile und macht außerdem dann einen Unterschied, wenn die Auswertung des zweiten Operands möglicherweise ein Exception werfen kann.

Das steht aber auch in jedem (guten) C#-Buch sowie in der :rtfm: Doku zum Nachlesen.

Da das Ergebnis eines Vergleichs ein logischer Wert ist, hast du schon recht, dass es mindestens irreführend ist, (a == TestEnum.ABC | a == TestEnum.DEF | a == TestEnum.GHI); zu schreiben. Das sollte man vermeiden. Es gibt hier keinen Grund, die Auswertung aller Operanden zu erzwingen, im Gegenteil.

herbivore

PS: Im Titel "Enumeratoren" durch "enums" ersetzt, weil es ja hier um "Enumerationen" geht.

467 Beiträge seit 2007
vor 15 Jahren

tut mir Leid, dass ich so eine Anfänngerfrage gestellt habe. Ich habe mein "gutes" C# Buch einem Freundgeliehen, der es mir seit 8 Monaten nicht zurückgibt(obwohl er noch nichtmal damit angefangen hat), und diese Sachen vergessen, weil nie benutzt.(soll kein Rechtfertigungsversuch sein)

Gelöschter Account
vor 15 Jahren

ah ich hatte natürlich diese variante gemeint:

(a == TestEnum.ABC | TestEnum.DEF | TestEnum.GHI); 

sry mein fehler.