| Autor |
Beitrag |
-CrimeTime-
      
Beiträge: 55
|
Verfasst: So 28.11.10 22:03
Hallo,
ich möchte gerne aus einer enum Daten vergleichen, und mir dann den Name der Enum ausgeben lassen, ich habe mir es so gedacht:
C#-Quelltext 1: 2: 3: 4:
| if(enumEnthält(Zahl)) { dein Geld reicht für Enum(getränk) } |
die Zahl wird bereits ausgelesen, mein Problem ist nur das vergleichen mit der enum und die wieder gabe des Getränks.
hier der Beispiel Code der Enum:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| public enum Getränke : int { Milch = 100, Cola = 110, Kakao = 105, Limo = 120 } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 28.11.10 23:29
Meinst du so etwas? C#-Quelltext 1: 2: 3: 4:
| foreach (int a in Enum.GetValues(typeof(Getränke))) { if (a < Value) ... |
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: So 28.11.10 23:53
Weiß nicht, aber vielleicht wäre es bei so einem ungeordneten Enum hilfreich, die Werte erst einmal in die richtige Reihenfolge zu bringen:
C#-Quelltext 1: 2:
| var orderedValues = Enum.GetValues(typeof(Getränke)).OfType<Getränke>() .OrderBy(g => (int)Enum.Parse(typeof(Getränke), g.ToString())); |
Und dann vielleicht noch die Abfrage, welche Werte überhaupt in dem Bereich des Wertes liegen:
C#-Quelltext 1:
| var passingValues = orderedValues.Where(g => (int)g <= value); | Und dann hat mit einer ForEach durchgehen.
Marko
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Mo 29.11.10 00:19
also wenn ich es so versuche:
Quelltext 1:
| if (Enum.GetValues(typeof(Getränke)) == Zahl) |
bekomme ich diese Fehlermeldung:
Operator '==' cannot be applied to operands of type 'System.Array' and 'int'
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 29.11.10 00:21
GetValues gibt dir alle Werte zurück, die kannst du auch nicht alle gleichzeitig mit einem Wert vergleichen.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 29.11.10 00:31
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mo 29.11.10 07:26
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Mo 29.11.10 07:29
das Problem bei mir ist das ich bereits eine geöffnete "foreach" Schleife habe, somit denke ich mir benötige ich eine If Schleife um den neuen "foreach" code den jaenicke gepostet hat nutzen zu können.
Ich bin jetzt bestimmt schon einige Stunden am Tüfteln wie ich am besten die if Schleife Realisiere, doch leider habe ich noch nicht viel mit sowas gearbeitet.
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 29.11.10 07:57
Ich kann LINQ auch nicht, aber es wurde doch schon gepostet: C#-Quelltext 1: 2: 3: 4:
| foreach (Getränke a in Enum.GetValues(typeof(Getränke)).OfType<Getränke>().Where(g => (int)g <= Value)) { MessageBox.Show(a.ToString()); } |
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Mo 29.11.10 12:14
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mo 29.11.10 14:34
Hallo,
also Du willst nur den string des Wertes aus dem Enum zurückgeben, wenn der Wert exakt passt?
Dann könnte die Abfrage so aussehen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| int i = 100; if (Enum.IsDefined(typeof(Getränke), i)) { Getränke getränk = (Getränke)i; } else { } | Hatte es aber eigentlich so verstanden, dass Du das (teuerste) Getränk ausgeben willst, was man sich mit dem Wert kaufen kann. Dann müsstest Du die Werte per Schleife durchlaufen. Oder Du filterst erst alle Getränke raus, die man mit dem Wert kaufen könnte, und davon dann noch den Max-Wert:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| int i = 100; IEnumerable<Getränke> getränkeImBereich = Enum.GetValues(typeof(Getränke)).OfType<Getränke>().Where(g => (int)g <= i); if (getränkeImBereich != null && getränkeImBereich.Count() > 0) { Getränke teuerstesGetränk = getränkeImBereich.Max(); } else { } |
LG
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Mo 29.11.10 15:10
sorry für die ganzen Missverständnisse, aber ich benötige es nun endgültig in dieser Form:
Quelltext 1:
| if (!((Enum.GetValues(typeof(Getränke(Zahl)) != -1) |(Enum.GetValues(typeof(Essen(Zahl) != -1))) |
doch leider bekomme ich bei diesem code diese Fehlermeldung:
Method name expected und er markiert (typeof(Getränke rot. das selbe passiert auch bei Essen.
edit:
die Enum Essen existiert bereits!
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 29.11.10 20:06
Das geht ab 4.0 ganz einfach:
C#-Quelltext 1:
| Enum.IsDefined(typeof(Getränk), Zahl) |
Ansonsten kannst du diese Methode natürlich leicht mit jaenickes foreach-Code nachbauen, wenn du dort "<" durch "==" ersetzt. Natürlich geht es auch wieder mit LINQ, aber das wäre wohl noch etwas zu früh  .
_________________ >λ=
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mo 29.11.10 21:32
Sorry, aber ich finde echt, dass schon alle möglichen Abfragemechanismen gepostet wurden. Und da spielt es auch keine Rolle, ob Du nun ein oder zwei Enums abfragen willst!
Und die Frage, ob Du abfragen willst, ob nun genau ein Wert in den Enum (oder den 2) enthalten sein muss, oder nur der maximale Wert aus dem Enum zurückgegeben werden soll (bei 2 schon komlizierter) hast Du auch noch nicht beantwortet.
Vielleicht schreibst Du einfach mal, was Du erreichen willst. Das wäre mal ganz interessant, um weiter zu helfen!
Marko
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Di 30.11.10 02:50
Danke Kha für den Code, doch leider bringt er nicht das gewünschte Ergebniss, hier wie ich ihn verwende:
Quelltext 1:
| if (!((Enum.IsDefined(typeof(Getränke), Zahl) != -1) | (Enum.IsDefined(typeof(Essen), Zahl) != -1))) |
Fehlermeldung: Operator '!=' cannot be applied to operands of type 'bool' and 'int'
@ Trashkid:
Also ich möchte einfach wenn die Zahl in Essen oder Getränke vorhanden ist das er den Code in der If Schleife durchführt.
Edit:
Ich habe es nun so:
Quelltext 1: 2: 3: 4:
| if (!((Enum.IsDefined(typeof(Getränke), Zahl)) == true | (Enum.IsDefined(typeof(Essen), Zahl)) == true)) { continue; } |
unter diesem Code ist eine Weitere If Schleife, die ausgeführt werden soll wenn die Zahl in Getränke oder Essen vorhanden ist, doch leider findet er diese Zahl nicht obwohl sie in der Enum Vorhanden ist, und geht nicht zur nechsten If Schleife.
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 30.11.10 06:50
Was für eine Schleife? Ich sehe keine.
Und dann frage ich mich, warum du es dir eigentlich so kompliziert machst: C#-Quelltext 1: 2: 3:
| if (Enum.IsDefined(typeof(Getränke), Value) | Enum.IsDefined(typeof(Essen), Value)) { ... |
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Di 30.11.10 07:04
das sieht doch schonmal viel besser aus, nur irgendwie glaube ich das ich es mit GetValue brauche weil ich ja nicht den Name des Getränks bzw. des Essens auslesen möchte sondern die Zahl.
Oder macht der Code das so?
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 30.11.10 07:07
Wie meinen?
Der Code schaut einfach nur, ob der Wert in einem der beiden Enums drin ist, der liest gar nix aus. 
|
|
-CrimeTime- 
      
Beiträge: 55
|
Verfasst: Di 30.11.10 07:29
also ich Teste ihn jetzt schon die ganze Zeit, und mir kommt es so vor als würde er nur den Name des Getränks oder Essens Auslesen, und nicht den Wert.
Edit:
was natürlich auch sein kann ist das meine 2. if Schleife einfach nur Datenschrott ist.
hier der Code davon:
C#-Quelltext 1: 2: 3: 4:
| if (Enum.IsDefined(typeof(Getränk), Zahl) && blacklist.IndexOf(Zahl) == -1 && checkbox1.Checked) { MessageBox.Show("Test"); } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 30.11.10 07:53
Hast du dir denn beim Debuggen einmal die einzelnen Werte angeschaut?
Und bist du sicher, dass && richtig ist? Ich dachte das wäre bitweise, d.h. hier wäre & richtig.
Für diesen Beitrag haben gedankt: -CrimeTime-
|
|