Autor Beitrag
-CrimeTime-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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:

ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
    public enum Getränke : int
    {
        Milch = 100,
        Cola = 110,
        Kakao = 105,
        Limo = 120
    }


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.11.10 23:29 
Meinst du so etwas?
ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (int a in Enum.GetValues(typeof(Getränke)))
{
    if (a < Value)
...
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
var passingValues = orderedValues.Where(g => (int)g <= value);					
Und dann hat mit einer ForEach durchgehen.
Marko
-CrimeTime- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Mo 29.11.10 00:19 
also wenn ich es so versuche:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 29.11.10 00:31 
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
.OrderBy(g => (int)Enum.Parse(typeof(Getränke), g.ToString()));					
Ein weniger abenteuerlicher Weg wäre .OrderBy(g => g) ;) .

_________________
>λ=
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 29.11.10 07:26 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
.OrderBy(g => (int)Enum.Parse(typeof(Getränke), g.ToString()));					
Ein weniger abenteuerlicher Weg wäre .OrderBy(g => g) ;) .
Ups :oops: Habe noch nicht so die Megaerfahrungen mit Linq.
Aber gut zu wissen.
-CrimeTime- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.11.10 07:57 
Ich kann LINQ auch nicht, aber es wurde doch schon gepostet:
ausblenden 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Mo 29.11.10 12:14 
da beisst die Maus kein Faden ab ich benötige das in einem if String, weil der sonst x mal kakao schreibt, und mit dem if String wird dies verhindert, da er dies dann so handelt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
If (Getränk == Zahl)
{
foreach schleife von jaenicke
}
else
{
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:
ausblenden 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

   //der Wert wurde nicht im Enum gefunden
}
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:
ausblenden 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

   //keine Getränke für den Wert zu haben!
}

LG
-CrimeTime- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Mo 29.11.10 15:10 
sorry für die ganzen Missverständnisse, aber ich benötige es nun endgültig in dieser Form:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 29.11.10 20:06 
Das geht ab 4.0 ganz einfach:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
if (Enum.IsDefined(typeof(Getränke), Value) | Enum.IsDefined(typeof(Essen), Value))
{
    ...
-CrimeTime- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.11.10 07:07 
Wie meinen? :gruebel:

Der Code schaut einfach nur, ob der Wert in einem der beiden Enums drin ist, der liest gar nix aus. :nixweiss:
-CrimeTime- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
if (Enum.IsDefined(typeof(Getränk), Zahl) && blacklist.IndexOf(Zahl) == -1 && checkbox1.Checked)
{
MessageBox.Show("Test");
}


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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-