ColdEyes Geschrieben 19. Februar 2018 Teilen Geschrieben 19. Februar 2018 Hallo, ich bin relativ neu noch mit dem Umgang von C# und bin nun auch am ende meines Lateins angelangt. Ich habe in der Schule eine Freiwillige Aufgabe bekommen wobei ich ein "Würfelspiel" erstellen soll. Darin soll ich Über eine Textbox die Anzahl der Würfelwürfe angeben und mit einer for funktion dieses halt würfeln lassen das ist auch noch nicht das Problem zu dem sollen alle zahlen nach dem durchlauf alle in eine 2. Textbox aufgelistet werden und eine Statistik angelegt werden wie oft welche Zahl geworfen wurde. Nun meine Fragen: Wie kann ich von der Textbox die String ausgibt und nach Int Convertiert wurde diese Zahl für meine Loops einfügen damit dieser n mal diesen Code abspielt Wie kann ich die Zufallszahlen die dabei Raus gekommen sind abspeichern und diese alle in einer Textbox wieder geben Mein Gedanke der dabei kam ist dies irgendwie in einen Array zu speichern nur da die Anzahl an zahlen varriert ist dies auf meinem Wissensstand nicht möglich ich habe es zwar versucht nur glaube nicht das dies wirklicht klappt. Hier unten ist Mein kläglicher Versuch. vielleicht weiß jemand was ich ändern muss dadran das dies klappt private void button1_Click(object sender, EventArgs e) { int a; String Anzahl = textBox1.Text; textBox1.Text = Anzahl.ToString(); int b = Anzahl; for ( int i = 0; i < b; i++) { Random Zufall = new Random(); int Zahl = Zufall.Next(1, 6); textBox2.Text = Zahl.ToString(); a++; } int[] GesamtZAHL; GesamtZAHL = new int[a]; textBox2.Text = GesamtZAHL; ich hoffe jemand weiß wie ich dies noch retten kann. Ich bedanke mich schon mal im voraus für alle Denkanstöße und Hilfen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 19. Februar 2018 Teilen Geschrieben 19. Februar 2018 Um ein String in ein Int zu wandeln, kannst du dir ja mal die Methoden Int.TryParse() oder die Convert.ToInt32() anschauen. Dein ganzer Code macht aber wenig Sinn. Fangen wir mit folgenden Zeilen an: String Anzahl = textBox1.Text; textBox1.Text = Anzahl.ToString(); Du speicherst den Text von textbox1 in die Variable Anzahl. Danach setzt du den Text von textbox1 mit Anzahl. Wozu? textBox1 hat doch schon den Wert. int b = Anzahl; Kann nicht funktionieren. b ist ein Integer und Anzahl ein String. for ( int i = 0; i < b; i++) { Random Zufall = new Random(); int Zahl = Zufall.Next(1, 6); textBox2.Text = Zahl.ToString(); a++; } Eine Instanz der Random-Klasse brauchst du nur einmal erstellen und nicht jedes Mal neu. int[] GesamtZAHL; GesamtZAHL = new int[a]; textBox2.Text = GesamtZAHL; Die letzte Zeile funktioniert nicht, weil Text ein String ist und GesamtZAHL ein Array. Du kannst also folgendes machen: Den Text von textBox1 in eine Zahl konvertieren und in eine Variable speichern Erzeugst eine Instanz von Random Durchläufst eine Schleife so oft, wie die Anzahl der Würfelversuche (Variable aus Schritt 1) In der Schleife erzeugst du mittels der Instanz von Random eine Zufallszahl Die Zufallszahl fügst du an Text von textBox2. (textBox2.Text += zufallszahl.ToString()) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 20. Februar 2018 Teilen Geschrieben 20. Februar 2018 (bearbeitet) vor 13 Stunden schrieb ColdEyes: Wie kann ich die Zufallszahlen die dabei Raus gekommen sind abspeichern und diese alle in einer Textbox wieder geben Mein Gedanke der dabei kam ist dies irgendwie in einen Array zu speichern nur da die Anzahl an zahlen varriert ist dies auf meinem Wissensstand nicht möglich ich habe es zwar versucht nur glaube nicht das dies wirklicht klappt. Wenn du die erzeugten Zahlen auch speichern möchtest, und nicht einfach nur, so wie es @Whiz-zarD schon geschrieben hat, in der Textbox ausgeben willst, ist die Idee mit dem Array schon gar nicht verkehrt. Und die Anzahl an Zahlen variert ja nur zwischen den verschiedenen Programmdurchläufen. Ab dem Moment, wo du abfragst bzw. ausliest, wie oft gewürfelt werden soll, ist dir die Anzahl ja bekannt und du kannst ab dem Moment auch dein Array mit der gewünschten Größe instanzieren. Das schöne ist ja, dass man keine feste Zahl braucht, sondern dort auch mit Variablen arbeiten kann. In deinem Fall wäre es also z.B. int[] result = new int; vor 13 Stunden schrieb ColdEyes: int[] GesamtZAHL; GesamtZAHL = new int[a]; Wenn du deinem Array nach der Deklaration direkt auch die Größe mitgibst, kannst du dir hier auch etwas Tipperei sparen (siehe mein Beispiel darüber). vor 13 Stunden schrieb ColdEyes: int a; [..] int b = Anzahl; for ( int i = 0; i < b; i++) { [..] a++;} Die Variable b nutzt du, um die Anzahl der Würfelwürfe zu ermitteln und setzt sie bereits richtig als Endwert für deine For-Schleife ein. In der For-Schleife zählst du dann noch einmal mittels der Variable a die Anzahl der Würfelwürfe. D.h. du hast nach der Schleife zwei Variablen, die genau dasselbe darstellen (die Anzahl der Würfelwürfe). Das ist aber unnötig, da du, falls du innerhalb der Schleife mit a arbeiten möchtest, bereits die Zählvariable i hast (die innerhalb der Schleife den selben Wert wie a besitzt) und ansonsten mit der Variable b arbeiten kannst. vor 13 Stunden schrieb ColdEyes: Random Zufall = new Random(); int Zahl = Zufall.Next(1, 6); Die Methode Random.Next(Int32, Int32) ermittelt bei dir übrigens nur Zahlen zwischen 1 und 5. Die 6 wird, so wie du es definiert hast, nie gewürfelt, da der Maximalwert dieser Methode als "exklusiv" gehandhabt wird. Als kleinen Tipp würde ich dir übrigens noch auf den Weg geben, dass du dir stets im Hinterkopf behalten solltest, mit welchen Datentypen du arbeitest und auch welche Variablen welchen Datentyp haben, so dass du an der entsprechenden Stelle eine passende Typumwandlung durchführst; am Besten auch immer mit entsprechendem Errorhandling. Denn, wenn beispielsweise Zahlen als Text(=String) eingegeben werden sollen, kann man nie sicher sein, dass jeder User das auch wirklich so tut. Bearbeitet 20. Februar 2018 von Rienne Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 20. Februar 2018 Teilen Geschrieben 20. Februar 2018 Von mir noch ein kleiner Punkt zu Random. @Whiz-zarD hatte zwar schon geschrieben, dass du nur eine Instanz brauchst, aber vllt. ist es ganz hilfreich, zu erklären, wieso mehrere Instanzen sogar "schädlich" sind. Wenn du in C# eine neue Random-Instanz erzeugst, wird diese (sofern nicht anders angegeben) mit der aktuellen Zeit als Seed erzeugt, was dazu führt, dass du in so kurzen Schleifendurchläufen oft die gleiche Zahl mehrmals hintereinander bekommst. Zur Veranschaulichung: for(int i = 0; i < 5; i++) { var r = new Random(); Console.WriteLine(r.Next(1,10)); } /* Ausgabe: * 8 * 8 * 8 * 8 * 8 */ // ------------------------------ var r = new Random(); for(int i = 0; i < 5; i++) { Console.WriteLine(r.Next(1,10)); } /* Ausgabe: * 9 * 6 * 8 * 1 * 3 */ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 20. Februar 2018 Teilen Geschrieben 20. Februar 2018 Memo an mich: Man sollte nicht zwei Dinge auf einmal erledigen. Ich dachte, es geht nur darum, die Zufallszahlen auszugeben. Es soll ja noch ausgegeben werden, wie oft welche Zahl gewürfelt wurde. Fürs Auswerten gibt es mehrere Ansätze aber ich denke der Ansatz mit einem weiteren Array ist für dich das verständlichste. Du hast ja ein Würfel mit sechs Seiten. Daher könntest du auch ein Array mit sechs integer-Werten instanziieren: int[] würfel = new int[6] // würfel[0] -> Anzahl der Würfe der Zahl 1 // würfel[1] -> Anzahl der Würfe der Zahl 2 // würfel[2] -> Anzahl der Würfe der Zahl 3 ... // würfel[5] -> Anzahl der Würfe der Zahl 6 Jeder Wert steht für die Anzahl der Würfe und die Indexierung entspricht die Zahl auf dem Würfel. Wenn also in deinem Array mit deinen Zufallszahlen eine 3 vorkommt, dann kannst du ja den dritten Wert des Würfel-Arrays um 1 erhöhen. Aber aufpassen: Die Indexierung eines Arrays fängt bei 0 an. D.h. würfel[0] wäre in Wirklichkeit die Zahl 1 auf dem Würfel. Falls du die Dictionary-Klasse kennen solltest, kannst du es auch damit machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ColdEyes Geschrieben 21. Februar 2018 Autor Teilen Geschrieben 21. Februar 2018 Hey ich habe es jetzt geschafft obwohl ich den Array nun weg gelassen habe ich weiß es ist wahrscheinlich nicht die beste art das Problem beiseite zu schaffen aber für eine Übung sollte das ja reichen^^ Hier einmal der Fertige Code: private void button1_Click(object sender, EventArgs e) { textBox2.Text = ""; int Eins = 0; int Zwei = 0; int Drei = 0; int Vier = 0; int Fünf = 0; int Sechs = 0; int Anzahl = Convert.ToInt32(textBox1.Text); Random Zufall = new Random(); for (int i = 0; i < Anzahl; i++) { int Zahl = Zufall.Next(1, 7); textBox2.Text = textBox2.Text + " " + Zahl.ToString(); if (Zahl == 1) Eins += 1; if (Zahl == 2) Zwei += 1; if (Zahl == 3) Drei += 1; if (Zahl == 4) Vier += 1; if (Zahl == 5) Fünf += 1; if (Zahl == 6) Sechs += 1; } label3.Text = "Es wurde " + Eins + " mal die Eins gewürfelt"; label4.Text = "Es wurde " + Zwei + " mal die Zwei gewürfelt"; label5.Text = "Es wurde " + Drei + " mal die Drei gewürfelt"; label6.Text = "Es wurde " + Vier + " mal die Vier gewürfelt"; label7.Text = "Es wurde " + Fünf + " mal die Fünf gewürfelt"; label8.Text = "Es wurde " + Sechs + " mal die Sechs gewürfelt"; } Es wäre echt klasse wenn ihr noch Vorschläge hättet wie ich diesen Performanter, übersichtlicher etc machen könnte da ich wie gesagt noch ein Newbie bin wäre ein Code als Beispiel klasse falls sich jemand noch die Zeit nehmen mag p.s. Herzlichen dank für die Mühe und Aufwand einen zu helfen es hat mich definitiv weiter gebracht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 Tipps / Hinweise textBox2.Text = ""; int Eins = 0; int Zwei = 0; int Drei = 0; int Vier = 0; int Fünf = 0; int Sechs = 0; Vernünftige Benennung verwenden. int Anzahl = Convert.ToInt32(textBox1.Text); Was passiert wenn in textbox1.Text keine Zahl enthalten ist? textBox2.Text = textBox2.Text + " " + Zahl.ToString(); Sehr schlecht / unschön. Strings sind immutable! Diesbezüglich bitte StringBuilder oder String interpolation anschauen. label3.Text = "Es wurde " + Eins + " mal die Eins gewürfelt"; label4.Text = "Es wurde " + Zwei + " mal die Zwei gewürfelt"; label5.Text = "Es wurde " + Drei + " mal die Drei gewürfelt"; label6.Text = "Es wurde " + Vier + " mal die Vier gewürfelt"; label7.Text = "Es wurde " + Fünf + " mal die Fünf gewürfelt"; label8.Text = "Es wurde " + Sechs + " mal die Sechs gewürfelt"; Sehr schlecht / unschön. Strings sind immutable! Diesbezüglich bitte StringBuilder oder String interpolation anschauen. Des weiteren kannst du den Text in einem Textfeld abbilden und benötigst dafür nicht x label. if (Zahl == 1) Eins += 1; if (Zahl == 2) Zwei += 1; if (Zahl == 3) Drei += 1; if (Zahl == 4) Vier += 1; if (Zahl == 5) Fünf += 1; if (Zahl == 6) Sechs += 1; Lässt sich doch um einiges schöner mit einem Array abbilden. Die gewürfelte Zahl - 1 bildet dabei deinen Arrayindex ab. zahlen[Zahl-1] += 1; Dadurch sparst du dir das ge-Iffe, die Zich int variablen etc. Mal auf die schnelle. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 vor 2 Minuten schrieb r4phi: Dadurch sparst du dir das ge-Iffe, die Zich int variablen etc. Oder aber man macht es mittels Switch-Case, wenn man auf Arrays verzichten möchte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 (bearbeitet) vor 20 Minuten schrieb Rienne: Oder aber man macht es mittels Switch-Case, wenn man auf Arrays verzichten möchte. Hast dann aber das Problem das du Für jede mögliche Zahl eine weitere Variable definieren musst Unnötig Zeilen Code produzierst die sich durch einen einzeiler vereinfachen lassen Kommt die Anforderung "Es müssen Zahlen zwischen 1 und 12 gewürfelt werden" du mehrere Stellen anpassen musst. Die größe des Arrays kannst du, basierend auf der max. gewürfelten Zahl, dynamisch festlegen Du die Ausgabe nicht über eine iteration über das Array abbilden kannst und somit das ganze auch wieder dynamisch gestalten kannst public static void foo(int max, int throwCount) { var x = new int[max]; var r = new Random(); for (int i = 0; i < throwCount; i++) x[(r.Next(1, max + 1)) - 1]++; } ...müsste / sollte so ungefähr funktionieren. Bearbeitet 22. Februar 2018 von r4phi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 (bearbeitet) vor 34 Minuten schrieb r4phi: Tipps / Hinweise textBox2.Text = textBox2.Text + " " + Zahl.ToString(); Sehr schlecht / unschön. Strings sind immutable! Diesbezüglich bitte StringBuilder oder String interpolation anschauen. Was hat der gezeigte Code mit immutable oder nicht zu tun? Da wird kein String mutiert. Es wird ein neuer erzeugt. Was du meinst, ist das Anti-Pattern von "+=" in einer Schleife. Da könnte der geneigte Neuling der Meinung sein, der bestehende String würde erweitert, was er aber nicht wird. Das, was @ColdEyes geschrieben hat, wird intern zu sowas wie textBox2.Text = string.Concat(textBox2.Text, " ", Zahl.ToString()); und das ist völlig legitim. Bitte nicht anfangen, Neulingen zu erzählen, dass er das da oben in so was verwandeln soll: var builder = new StringBuilder(); builder.Append(textBox2.Text); builder.Append(" "); builder.Append(Zahl.ToString()); textBox2.Text = builder.ToString(); Das ist - wenn überhaupt - höchstens marginal performanter, aber zig mal schlechter lesbar. Auch String-Interpolation hat nichts damit zu tun, dass Strings immutable sind. Es ist einfach eine besser lesbare Form von string.Format. Das sähe im Falle des Beispiels dann so aus: textBox2.Text = $"{textBox2.Text} {Zahl.ToString()}"; Ob das in diesem Fall soviel lesbarer ist, weiß ich nicht, auch wenn ich mittlerweile auch dazu übergehe, das möglichst überall zu nutzen. Bearbeitet 22. Februar 2018 von arlegermi JimTheLion reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 @r4phi, dass habe ich auch nie in Frage gestellt. Allerdings geht es hier um eine Übung aus dem Schulunterricht. Und da wollte ich erwähnt haben, dass es eben noch eine Alternative zur wiederholten If-Abfrage gibt. Genauso kann man die einzelnen Zahlen auch als Enumeration definieren. Auch dadurch ließe sich die Ausgabe vereinfachen. (Nur als Input zu Datentypen - von Sinn oder Unsinn mal abgesehen) Um Eweiterbarkeit und Wiederverwendung von einzelnen Code-Abschnitten ist zu diesem Zeitpunkt wohl noch nicht die Rede und das wird vermutlich im Unterrichts des TO erst zu einem späteren Zeitpunkt behandelt werden. Das selbe gilt vermutlich für Error-Handling, was ich ja auch schon weiter oben angesprochen hatte. Es zu erwähnen halte ich für in Ordnung, aber der TO sollte sich dadurch nicht genötigt fühlen, es auch direkt korrekt umzusetzen. Das kann zu Frust führen und wird sicherlich mit der Zeit noch dazu kommen. vor 26 Minuten schrieb r4phi: Vernünftige Benennung verwenden. Dazu solltest du dann vielleicht auch noch den Hinweis geben, was in deinen Augen vernünftige Benennungen sind bzw. was es für Konventionen gibt (z.B. das hier). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 vor 3 Minuten schrieb arlegermi: Was hat der gezeigte Code mit immutable oder nicht zu tun? Da wird kein String mutiert. Es wird ein neuer erzeugt. Siehe das fett markierte. textBox2.Text + " " + Zahl.ToString(); Zwei "variablen" und eine statische Zeichenkette. Durch die Verkettung werden also drei Zeichenketten erzeugt. Wenn man Sachen macht oder lernt sollte man von Anfang an verstehen was man macht. Die bestehende wird nicht verändert. Es wird eine neue erzeugt. string.Format("{0} {1}", textBox2.Text, Zahl.ToString()); $"{textBox2.Text} {Zahl.ToString()}" Zitat A String is basically an immutable sequence of characters. Each character is a Unicode character in the range U+0000 to U+FFFF. Immutable means that its state cannot be modified after it is created. Thus, if you assign a value to a string then reassign. The first value will stay in the memory and a new memory location will be assigned to accept the new value. Let’s take these string allocations for example: String string1 = "Coding"; String string2 = "Sonata"; String string3; string3 = string1 + " " + string2; This leads to 4 memory addresses to be allocated: Coding, Sonata, [EmptyString] , and the Concatenation between Coding and Sonata Solche Sachen sollte man, vor allem an Anfang, schon Bedenken, im Hinterkopf haben und sich damit auseinandersetzen. Ob Verkettung mittels + oder StringBuilder passiert ist ein unterschied. Wenn er für dich nur marginal ist. Gut. Deine Entscheidung. vor 12 Minuten schrieb Rienne: @r4phi, dass habe ich auch nie in Frage gestellt. Allerdings geht es hier um eine Übung aus dem Schulunterricht. Und da wollte ich erwähnt haben, dass es eben noch eine Alternative zur wiederholten If-Abfrage gibt. Genauso kann man die einzelnen Zahlen auch als Enumeration definieren. Auch dadurch ließe sich die Ausgabe vereinfachen. (Nur als Input zu Datentypen - von Sinn oder Unsinn mal abgesehen) Um Eweiterbarkeit und Wiederverwendung von einzelnen Code-Abschnitten ist zu diesem Zeitpunkt wohl noch nicht die Rede und das wird vermutlich im Unterrichts des TO erst zu einem späteren Zeitpunkt behandelt werden. Das selbe gilt vermutlich für Error-Handling, was ich ja auch schon weiter oben angesprochen hatte. Es zu erwähnen halte ich für in Ordnung, aber der TO sollte sich dadurch nicht genötigt fühlen, es auch direkt korrekt umzusetzen. Das kann zu Frust führen und wird sicherlich mit der Zeit noch dazu kommen. Mir ging es auch Primär darum denkanstöße zu geben. Sonst sitze ich in paar Jahren wieder neben Leuten die keinerlei interesse haben sich mit solchen Sachen auseinander zu setzen und von solchen Sachen noch nie gehört haben. JimTheLion reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 (bearbeitet) Performance ist nicht das Problem. Über Performance würde ich mich erst Gedanken machen, wenn es wirklich ein Problem mit dieser gibt. Performanceoptimierung heißt in den meisten Fällen, dass der Code unübersichtlicher wird. Wie man den Code nun übersichtlicher macht, ist ein recht großes Thema und lässt sich auch nicht mit einfachen Worten erklären. Wenn du 10 Entwickler an die Aufgabe lässt, wirst du 11 Lösungen bekommen. In der Objektorientierung hat sich aber das sog. SOLID-Prinzip bewährt. Das S steht für "Single-Responsibility-Principle", das besagt, dass eine Methode oder eine Klasse nur für eine Sache zuständig sein soll. Wenn man jetzt deine button1_Click()-Methode anschaut, dann sie quasi für alles zuständig ist. Also sie würfelt, analysiert und macht die Ausgabe. Ich weiß es, weil ich die Aufgabe kenne und auch deine Gedanken dahinter verstanden habe aber kann ein anderer erkennen, dass der folgende Code ein Würfel sein soll? Random Zufall = new Random(); [...] int Zahl = Zufall.Next(1, 7); Nicht so wirklich, oder? Er sieht nur, dass du dort Zufallszahlen zwischen 1 und 6 generierst aber das es ein Würfel sein soll, lässt sich in diesem Kontext nicht herauslesen. Also würde ich im ersten Schritt genau daraus einen Würfel bauen. Also wir erstellen eine Klasse, die einen Würfel repräsentiert. Diese Klasse hat dann eine Roll()-Methode, die dann uns eine Zufallszahl zurückgibt. Das Endergebnis würde dann so aussehen: int number = dice.Roll(); So lässt sich dann auch im Kontext lesen, dass wir es mit einem Würfel zu tun haben, der gewürfelt wird. Analog das selbe gilt auch fürs Analysieren. Da würde ich auch eine Klasse bauen, die genau das übernimmt. Da könnte es dann z.B. eine Analyse()-Methode geben, die als Parameter die Nummer entgegennimmt und sie entsprechend eingruppiert. Eine GetCount()-Methode könnte dann die Anzahl zurückliefern: int number = dice.Roll(); analyser.Analyse(number); [...] label3.Text = "Es wurde " + analyser.GetCountOfNumber(1) + " mal die Eins gewürfelt"; Natürlich könnte man noch viel mehr erzählen. z.B. über MVC (Model-View-Controller), etc aber ich denke, das würde zu weit führen. Ich denke, dass selbst mein Text schon zu weit geht. Zum Thema String vs. StringBuilder vs. Stringinterpolation: vor einer Stunde schrieb r4phi: Sehr schlecht / unschön. Strings sind immutable! Diesbezüglich bitte StringBuilder oder String interpolation anschauen. Ich denke mal, der TE kann mit dem Wort "immutable" nichts anfangen. Ich bin mir nicht mal sicher, ob der TE überhaupt eine Ausbildung macht oder nur ein Schüler auf einer allgemeinbildende Schule ist. Daher sollte man ihn vielleicht auch mal erklären, was immutable heißt. Zumal es performancetechnisch wohl keinen allzu großen Unterschied macht, ob er die Strings verkettet und somit einen neuen erzeugt oder einen StringBuilder verwendet. Wenn er einen eigenen StringBuilder verwendet, dann muss jedes Mal die Clear()-Methode aufgerufen werden, was den Code zumüllen würde. Darüber hinaus müsste er jedes String-Fragment mit der Append()-Methode zusammenführen, was schlecht lesbar ist. Daher würde ich hier auf den StringBuilder verzichten und die Stringinterpolation verwenden. Diese verwendet intern auch nur die string.Format()-Methode und in dieser Methode wird ein gecachter StringBuilder verwendet, der eben die Clear()-Methode aufruft. Ob man jetzt also "Es wurde " + Eins + " mal die Eins gewürfelt"; oder $"Es wurde { Eins } mal die Eins gewürfelt"; ist aus meiner Sicht erst mal irrelevant. Da es sich hier um eine Mikrooptimierung des Code handelt. Dann läuft der Code halt 10 Nanosekunden langsamer. Na und? Wir reden hier nicht von einem Hochverfügbarkeitssystem, was die Zahlen in Echtzeit anzeigen soll. Ja, man kann die Problematik ansprechen aber geht es nicht erst mal darum, den Code lesbarer zu machen? Im Idealfall liest sich der Code wie ein Buch und da sollte die Reise hingehen und nicht welche Mikrooptimierung man nun unbedingt einbauen muss. Bearbeitet 22. Februar 2018 von Whiz-zarD arlegermi und JimTheLion reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 (bearbeitet) [edit] Oh weia, ich muss mich entschuldigen, @r4phi. Ich hatte nur das Zitat gesehen und den Kontext dabei übersehen. Das läuft ja in einer Schleife ab. Von daher hast du technisch gesehen in dem ersten Fall durchaus recht. Ich bleibe dennoch dabei, dass ich an dieser Stelle gut ohne StringBuilder leben kann, weil's 1) völlig performance-unkritisch ist und 2) in meinen Augen in dieser Form besser lesbar ist. Für den Fall mit den Labeln bleibt meine Argumentation aber bestehen. [/edit] Zitate ohne Quellenangabe sind immer super. Lies dir das hier durch. Dein Vorschlag mit dem StringBuilder ist einfach sinnlos. Er macht den Code schlechter lesbar und bringt keine (messbaren, wenn überhaupt vorhandenen) Vorteile. Quellcode von String.Concat - da wird aus den drei Referenzen ein neuer String erzeugt. Und dass die Strings im Speicher sind, ist völlig klar. Daran ändert in diesem Fall aber auch ein StringBuilder nichts. Wenn du StringBuilder.Append(string value) aufrufst, ist der String, den du als Parameter reingibst, auch schon im Speicher vorhanden. Im Übrigen stimme ich @Whiz-zarD vollends zu, dass, selbst wenn StringBuilder messbar effizienter wäre, der Gewinn in Anbetracht der schlechteren Lesbarkeit völlig zu vernachlässigen ist. Bearbeitet 22. Februar 2018 von arlegermi JimTheLion reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tician Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 (bearbeitet) Heya, ach immer diese demotivierenden Leute hier und ihre unterschiedlichen Meinungen^^ Für den Anfang sieht es gut aus, immerhin du hast es zum Laufen gebracht, richtig? Super! Ich bin kein Profi wie die anderen die mit Fachbegriffen um sich schmeißen, aber eine einzige Anmerkung habe ich Du hast wie schon gesagt wurde das Problem, dass du immer davon ausgehen musst, dass die Leute die dein Programm bedienen strohdoof sind. Heißt es dauert nicht lang und irgendjemand gibt in deiner Textbox keine Zahl sondern zum Beispiel einen Buchstaben ein und drückt auf deinen Button. Was passiert? Richtig, der PC explodiert... OK tut er nicht, aber dein Programm wird damit wenig anfangen können und stürzt im momentanen Zustand einfach ab. Die Lösung: "try" und "catch" sind dafür da um solche Fehler abzufangen und dein Programm vor dem Absturz zu bewahren. Die wirst du in Zukunft auch sehr häufig brauchen, ich würde dir also raten dir das mal schnell anzusehen, es ist wirklich nicht schwer das einzubauen Ich würde dir jetzt am Anfang empfehlen im "catch"-Blick etwas zu schreiben wie MessageBox.Show("Gib gefälligst ne Zahl ein!"); Alles was jetzt noch gesagt wurde ist Performance-Kram und Hintergrundwissen mit dem du dich früher oder später definitiv beschäftigen musst. Also nochmal kurz die Liste: - Namenskonventionen (Was solltest du groß und klein schreiben zum Beispiel?) Das sind keine Regeln, sondern nur Richtlinien, aber wenn 10 Leute an einem Projekt arbeiten und jeder was anderes macht gibt es Chaos, deswegen gibt es da so ein paar Standard-Sachen. Ich zum Beispiel habe gelernt das die normalen Variablen wie du sie hast (in deinem Fall 'Eins', 'Zwei' usw) immer klein geschrieben werden. - Deine Strings. Am Anfang wird jedem beigebracht "Hallo " + name + " wie geht es dir heute?"; Das ist zwar richtig, aber nicht perfomant. Außerdem bauen sich schnell Fehler ein wenn du mal einen richtig langen text hast. Schau dir dazu tatsächlich string interpolation an. - Arrays. Die hast du jetzt gekonnt übersprungen, aber sie sind ein ganz wichtiger Bestandteil der Programmierung und werden dich überall verfolgen, egal in welcher Programmiersprache. Probier es mal und erstelle ein Array für deine 6 Zahlen: int[] zahlen = new int[6]; zahlen[0] = 0; zahlen[1] = 0; zahlen[2] = 0; zahlen[3] = 0; zahlen[4] = 0; zahlen[5] = 0; //oder besser: int[] zahlen = {0, 0, 0, 0, 0, 0}; //später dann: if (Zahl == 1) zahlen[0] += 1; if (Zahl == 2) zahlen[1] += 1; Das Gemeine: Die Zahl in der eckigen Klammer wird "Index" genannt. Im ersten Beispiel sagst du, dass du ein Array mit 6 'variablen' haben möchtest, aber der Index beginnt trotzdem bei 0, geht also für 6 Zahlen nur bis 5. - Und schlussendlich noch zu den if-abfragen, da wäre ein switch/case besser geeignet, das ist auch nicht sonderlich schwer. https://www.dotnetperls.com/switch Allgemein bin ich ein Fan der Seite dotnetpearls, die Beispiele sind einfacher zu verstehen als bei Microsoft Bearbeitet 22. Februar 2018 von Tician arlegermi und thereisnospace reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pointerman Geschrieben 22. Februar 2018 Teilen Geschrieben 22. Februar 2018 vor 5 Stunden schrieb Tician: //später dann: if (Zahl == 1) zahlen[0] += 1; if (Zahl == 2) zahlen[1] += 1; Oder noch schlanker: zahlen[Zahl-1]++; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.