Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Entscheidungen mit enums verkürzen
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

Entscheidungen mit enums verkürzen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ANSI_code
myCSharp.de - Member

Avatar #avatar-2839.jpg


Dabei seit:
Beiträge: 467
Herkunft: Bayern

beantworten | zitieren | melden

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");
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ANSI_code am .
private Nachricht | Beiträge des Benutzers
Steav
myCSharp.de - Member



Dabei seit:
Beiträge: 142

beantworten | zitieren | melden

Hallo thepaul,

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

mfg Steav
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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

das geht dann so:

(a == TestEnum.ABC | a == TestEnum.DEF | a == TestEnum.GHI);
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beantworten | zitieren | melden

Danke euch allen.

Flags waren das was ich gesucht habe
private Nachricht | Beiträge des Benutzers
ANSI_code
myCSharp.de - Member

Avatar #avatar-2839.jpg


Dabei seit:
Beiträge: 467
Herkunft: Bayern

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
thepaul
myCSharp.de - Member



Dabei seit:
Beiträge: 151
Herkunft: Jena

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ANSI_code
myCSharp.de - Member

Avatar #avatar-2839.jpg


Dabei seit:
Beiträge: 467
Herkunft: Bayern

beantworten | zitieren | melden

[offtopic]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)[/offtopic]
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

ah ich hatte natürlich diese variante gemeint:

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

sry mein fehler.