C# Wie kann ich mehrere werte von z.b. einer Switch case Anweisung in meine Main Methode ,,returnen''?
Hallo, ich habe ein kleines Problem wofür ich am besten schnell eine Antwort brauche, da dass Schulprojekt heute Nacht per email bei meinem Schulleiter sein muss.
Wir haben die Aufgabenstellung bekommen dieses projekt in 2 Methoden aufzuteilen. Einmal die static void Main und dann eine eigene. WIr sollen dort Spannung,widerstand und Ampere berechnen können mit allen physikalischen regeln. Diese mit der Switch case und einer if abfrage einzustellen ist kein Problem aber ich habe dadurch in meiner eigenen Methode allein 3 mögliche Ergebnisse und 3 bool werte die ich an die Main Methode ,,return'' muss.
Will halt in der Main Methode eine if abfrage machen, die dann feststellt welches Ergebnis den vorliegt [also R,U oder I (dafür brauch ich die Bool Werte)].
Habt ihr eine Idee wie ich das machen kann? Hab halt in einer case ein Ergebnis sowie einen bool der returnt werden muss. Daher klappt meiner Meinung nach der ,,return'' als jump Anweisung am eende einer case nicht(kann damit ja nur einen wert wiedergeben).
Würde mich über Hilfe freuen.
Hier mal schnell nen kleiner Ausschnitt aus dem Code um es Bildlich zu zeigen:
if (bRZahl == true) {
Console.Clear();
Console.SetCursorPosition(2, 1);
Console.Write("Spannung Berechnen");
Console.SetCursorPosition(2, 5);
Console.Write("Geben sie den Wert für I (Ampere) an:");
switch (ckiTaste.Key)
{
Hier stehen eigentlich die Physikalischen Grenzen drinne!!!
}
Console.ReadKey(ckiTaste.Key == ConsoleKey.N);
IZahl = Convert.ToDouble(sbEingabe2);
UZahl = IZahl * RZahl;
Spannung = true;
}
return UZahl;
Das ist jz nur der 2 Teil der Case. DIe seite lässt die ganze case nicht zu. Aber da sieht man schonmal die beiden Werte die ich mit rüber nehmen will. Hier als Beispiel UZahl und Spannung. Diese If Abfrage hier liegt halt in der Case 1 (für die Berechnung der Spannung)
Würde mich auf jedenfall über Hilfe freuen Danke.
4 Antworten
Du könntest entweder ein Array zurückgeben oder ein Objekt einer vorher erstellen Klasse. Alternativ (wenn Du eine variable Anzahl an Rückgabewerten hast) empfiehlt sich auch noch eine List.
Hierfür eine Liste oder ein Array in Betracht zu ziehen, ist sehr schlechter Programmierstil.
Du solltest das auf jeden Fall vor dem Switch/Case deklarieren.
Eine Liste ist ein normales Objekt, das Du mit List<Datentyp> liste =new List<Datentyp>() erstellst, bei einem Array musst Du direkt beim Deklarieren direkt die Länge festlegen: Datentyp[] array = new Datentyp[Länge].
Ich frage mich übrigens gerade, ob es in Deinem Fall nicht sinnvoller wäre, einen Integer zurückzugeben, denn so wie ich das verstanden habe, kann ja immer nur einer von Werten true sein, oder?
Also, das die List etc am anfang deklariert wird ist mir klar. Mir gings eher um die Zuweisung der werte aber hab das jz verstanden(kurz gegoogelt).Versteh nur nicht was du jz genau mit der letzteren Sache meinst. Integer und double geben doch nur die größen an also von x bis x. Oder haben die noch andere Unterschiede? Denn true und false hängen ja mit dem Bool zusammen.
Mein plan war halt folgender: Per Switch case entscheidet man sich für die Rechnung (Also was man berechnen will). Am ende des ganzen wird dann der jeweilige Bool der zur Rechnung gehört auf true gesetzt und Wert sowie Bool wird an die Main Methode gesendet. Dort checkt dann eine If abfrage welche Rechnung statt gefunden hat und gibt je nachdem die richtige Lösung an.
Ah, okay, dann hab ich das beim Überfliegen falsch verstanden ^^
Der Liste gibst Du mit Add Werte. Du benutzt sie dann wie ein Array.
ok danke. Ich werde es dann jz mal versuchen.
Sollte ich nicht mehr schreiben ob es geklappt hat habe ich mir vor Lauter frust die Pulsadern aufgeschnitten ;D.
Nochmal schnell eine kleine frage wegen dem Add.
Ich habe jz folgendes probiert WerteListe Add = UZahl;
aber das klappt net. Da bekomme ich die Meldung : WerteListe ist eine Variable wird aber wie ein typ verwendet.
wenn ich nur Add mache klappt dies natürlich auch nicht, da er es nicht für die Liste erkennt.
muss ich noch etwas dazu schreiben also vor das Add oder habe ich da was Missverstanden?
Danke aufjedenfall schonmal dafür das du dir bis jz die Zeit genommen hast immer zu antworten.
Add ist eine Methode der Liste. Du musst es also mit liste.Add(Wert) aufrufen ;)
ok danke. Wenn ich doch nur nicht mein buch zu hause vergessen hätte wäre das alles kein problem^^.
Ähmm ich kann jz aber trotzdem immer noch nicht in der static void main Methode auf diese Liste zugreifen. Hab das grad mal probiert. Fehlt mir noch irgendetwas?
Es gibt folgende Optionen:
- gib ein struct oder ein Objekt zurück, welches alle Werte als eigene Eigenschaften speichert
- gib den boolschen Wert zurück und speicher den anderen Wert in einem out-Parameter
Sofern es sich nur um 2 Werte handelt (bool und eine Zahl), ist die 2. vorgestellte Option wohl die passendste Lösung. Hier ein kleines Beispiel für die Verwendung von out:
public static void Main() { int value = 0; if(colorIsRed("red", out value)) Console.WriteLine(value); }
public static bool ColorIsRed(string color, out int value) { switch(color) { case "red": value = 4; return true; case "blue": value = 1; return false; default: value = 0; return false; } }
Zunächst mal - das Verb zu "return" heißt "zurückgeben".
Von dem Text und dem Programmfragment habe ich nichts verstanden, aber zu der im Titel gestellten Frage:
C# ermöglicht "out"-Parameter:
bool tryEvaluateSomething(int a, int b, out double r1, out double r2, out double r3)
{
(versuche, ein Ergebnis zu ermitteln nd setze r1, r2 und r3 auf das Ergebnis)
return (Ermittlung war erfolgreich);
}
Ich habe bis jz im Internet immer nur gelesen, dass man die finger von dem ,,out'' lassen soll, da dies unsauber sein soll aber ich werds mal probieren.... ;D danke.
Und das return zurückgeben bedeutet weiß ich aber ich wollte es irgendwie in englisch stehen lassen KA warum.
C# ist auf "Sauberkeit" getrimmt. Die Sprache enthält keine Konstrukte, von denen man generell "die Finger lassen" soll.
"out" ist sauber, die Rückgabe eines Arrays ist es nicht. So eine Konstruktion, bei der I, R und U in Positionen 0, 1 und 2 eines Array zurückgegeben wird, würde Dir bei jedem Codereview um die Ohren gehauen werden.
ok merk ich mir Danke. Werde einfach mal eure beiden Methoden Ausprobieren.
Kannst nen array zurückgeben mit verschiedenen datentypen innerhalb
ja das mit der List oder Array hatte ich auch schon als Idee hab sowas nur leider noch nie gemacht ;D. Alos einfach Array/List deklarieren und dann am ende der Methode werte zuweisen ? Oder die List in die case?
Bin halt noch Änfanger (11 Klasse/ berufskolleg(Abi + Ausbildung zum ITA) und der Lehrer ist naja nicht der Beste.