2016-05-10 4 views
1

Ich bin noch relativ neu in C# und posten in einem Forum, aber ich versuche eine Funktion zu machen, die mir hilft, meinen Code zu verkürzen, damit er für jemanden, der neu in C# programmiert ist, lesbar ist wenn man so viele Zeilen Code liest.Wie fügt man Strings über eine Funktion zusammen?

Ill zeigen, was ich in der Codeansicht versuchen und erklären möchte, nur weil ich nicht gut darin bin, vorher zu erklären.

https://gyazo.com/3a440ca6c4f0fc1764f7edd41081e434 - Screenshot des gesamten Codes bisher.

Dies ist der Code in der Schaltfläche.

private void button7_Click(object sender, EventArgs e) 
    { //this works and outputs the total value. 

     /* int A, B, C, D, E, F, G, H, Answer; 

     A = int.Parse(textBox1.Text); 
     B = int.Parse(textBox2.Text); 
     C = int.Parse(textBox3.Text); 
     D = int.Parse(textBox4.Text); 
     E = int.Parse(textBox5.Text); 
     F = int.Parse(textBox6.Text); 
     G = int.Parse(textBox7.Text); 
     H = int.Parse(textBox8.Text); 

     Answer = A + B + C + D + E + F + G + H; 

     lblTotal1.Text = Answer.ToString(); 

     * */ 

     calc(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text, lblTotal1.Text); 

    } 

Dies ist der Code in der Funktion.

 private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8, string TextAnswer) 
    { 
     int A, B, C, D, E, F, G, H, Total; 
     A = int.Parse(TextBox1); 
     B = int.Parse(TextBox2); 
     C = int.Parse(TextBox3); 
     D = int.Parse(TextBox4); 
     E = int.Parse(TextBox5); 
     F = int.Parse(TextBox6); 
     G = int.Parse(TextBox7); 
     H = int.Parse(TextBox8); 

     Total = A + B + C + D + E + F + G + H; 

     TextAnswer = Total.ToString(); 

    } 

Zuerst dachte ich, es war wegen einer Zeichenfolge zu verwenden, aber ich weiß nicht, ob dies das Problem ist, und wenn ja, wie es zu beheben.

Wäre eine massive Hilfe, wenn mir jemand sagen könnte, was ich falsch mache. Vielen Dank im Voraus.

+0

was erwarten Sie zu bekommen? –

+0

Ich erwarte, die Summe aller Ganzzahlen zusammen zu bekommen und diese Antwort auf das Textfeld auszugeben. Ist das sinnvoll? – Stefan

Antwort

4

an dieser Lösung:

private string calc(params string[] input) 
{ 
    return input.Select(x => int.Parse(x)).Sum().ToString(); 
} 
+0

Der Nachteil hier ist, dass Sie zwei Durchgänge durch das Array machen mussten, eins für das 'select' und eins für das' sum' – Sean

+3

Ich bin nicht sicher, dass es kritische Leistungsprobleme im Zusammenhang mit TextBoxen verursachen wird. –

0

Ich glaube, Sie besser anstelle von Strings NumericUpDown Steuerung verwenden können. Es ist eine spezielle Steuerung für numerische Werte eingeben und hat die folgenden Vorteile im Vergleich zur Verwendung String-Input-Kontrollen:

  • Nur in der Lage numerische Werte
  • hat zwei kleine Tasten für die Zunahme/Abnahme
  • hat eine besondere eingeben Eigenschaft, um den Wert zu erhalten
  • Sie müssen nicht in Strings konvertieren, um zusammenzufassen.

Weitere Informationen finden Sie unter How do I make a textbox that only accepts numbers?.

0

könnten Sie calc schreiben

private string Calc(params string[] values) 
{ 
    int total = 0; 

    foreach(var value in values) 
    { 
    total += int.Parse(value); 
    } 

    return total.ToString(); 
} 

params zeigt eine params Array zu verwenden, dass die Funktion eine variable Anzahl von Argumenten entgegennimmt, so in die über der Funktion 0 oder mehr Strings nimmt. Der Compiler speichert die übergebenen Werte in einem Array, so dass Sie über regulären Array-Zugriffscode darauf zugreifen können.

Wenn Sie Linq verwenden möchten, dann können Sie die Sum Erweiterungsmethode verwenden:

private string Calc(params string[] values) 
{ 
    int total = values.Sum(value => int.Parse(value)); 
    return total.ToString(); 
} 
1

können Sie die Bedienelemente aufzählen (TextBox1..TextBox8):

private void button7_Click(object sender, EventArgs e) { 
    int Total = 0; 

    for (int i = 1; i <= 8; ++i) 
    Total += int.Parse(Controls 
     .Find(String.Format("textBox{0}", i), true) 
     .First() 
     .Text); 

    lblTotal1.Text = Total.ToString(); 
} 

Und Sie haben so keine Notwendigkeit, in Funktion.

0

Ich nehme an, Sie möchten wissen, was mit Ihrem Code falsch ist, anstatt es neu zu schreiben.Ihre calc Funktion berechnet den richtigen Wert aber die button7_Click Funktion empfängt es nie. Einstellung TextAnswer gleich der Antwort wird nicht funktionieren, da es von Wert anstelle von Verweis übergeben wird. Alternativ können Sie den Wert zurückgeben und gleich lblTotal1.Text setzen. Beispiele für beide sind unten.

Für vorbei Referenz

private void button7_Click(object sender, EventArgs e) 
{ 
    calc(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text, out lblTotal1.Text); 
} 
private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8, out string TextAnswer) 
{ 
    // Same code as original 
} 

für den Wert

private void button7_Click(object sender, EventArgs e) 
{ 
    lblTotal1.Text = calc(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text); 
} 
// Note the changed calc parameters 
private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8) 
{ 
    // Same code as original but change last line to 
    return Total.ToString(); 
} 
1

Nicht wenige Dinge, die Rückkehr in Ihrem Code verbesserungsfähig sind.

  1. Die Implementierung von calc ist falsch. Sie versuchen, die Antwort über das Argument TextAnswer zurückzugeben. Warum? Lassen Sie die Methode den Wert selbst zurückgeben, ohne ein out Argument zu verwenden (mehr dazu in # 3).

    Erst wenn eine Methode muss mehr als einen Wert zurückgeben sollten Sie out prüfen, mit der das Argument mit Verweis übergibt:

    private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8, out string TextAnswer) //note the out keyword prior to TextAnswer

    Sie auch ref statt out verwenden könnte aber out vermittelt die Bedeutung, dass die Das Argument wird als Ausgabe verwendet, und es ermöglicht eine Compiler-Hilfe, um sicherzustellen, dass die Variable vor dem Beenden der Methode gesetzt ist. Um mehr über das Thema zu erfahren, lesen Sie this und this.

    Der Standardwert in C# ist, dass Argumente nach Wert übergeben werden. Das heißt, eine Kopie des Arguments wird an die Methode übergeben. Das heißt, auch wenn Sie es ändern, ändern Sie nur die Kopie, das Original bleibt gleich. In Ihrem Fall ändern Sie einfach TextAnswer, was eine Kopie von lblTotal1.Text ist.

    Erneut, lassen Sie mich klarstellen, es gibt absolut keine Notwendigkeit, Referenzargumente in Ihrem Fall zu verwenden. Als Nebenbemerkung wäre es in Ihrem Fall nicht möglich, out zu verwenden, da Sie die Referenzeigenschaften nicht passieren können.

  2. Ihre Helfer-Methode calc ist schrecklich benannt. Verwenden Sie keine Abkürzungen, die Ihren Code verschleiern. Nenne es richtig: calculateSum zum Beispiel.

  3. Ihre Hilfsmethode hat einen merkwürdigen Vertrag. Sein Name besagt, dass er einfach einen Wert berechnet, aber nichts zurückgibt und scheinbar einen Nebeneffekt erzeugt; zeigt das Berechnungsergebnis in der Benutzeroberfläche an. Ein besserer Vertrag wäre die folgende:

    private int calculateSum(string text1, string text2, string text3, string text4, string text5, string text6, string text7, string text8)

    Jetzt ist der Vertrag klar: calculateSum ist eine Funktion, die 8-String Argumente nimmt und irgendwie produziert und liefert ein Ergebnis.

    Die Implementierung des Verfahrens wäre:

    private int calculateSum(string text1, string text2, string text3, string text4, string text5, string text6, string text7, string text8) 
    { 
        int A, B, C, D, E, F, G, H; 
        A = int.Parse(TextBox1); 
        B = int.Parse(TextBox2); 
        C = int.Parse(TextBox3); 
        D = int.Parse(TextBox4); 
        E = int.Parse(TextBox5); 
        F = int.Parse(TextBox6); 
        G = int.Parse(TextBox7); 
        H = int.Parse(TextBox8); 
    
        return A + B + C + D + E + F + G + H; 
    } 
    

    Und jetzt würden Sie es nennen wie folgt;

    private void button7_Click(object sender, EventArgs e) 
    { 
        lblTotal1.Text = calculateSum(textBox1.Text, textBox2.Text, ...); 
    } 
    
  4. Ihr Code verarbeitet keine falschen Eingaben. Was passiert, wenn eines der an calculateSum übergebenen Argumente nicht wirklich eine gültige Darstellung einer Zahl ist? Sagen Sie 134w4. int.Parse("134w4") wird kläglich scheitern, Ihre Anwendung wird abstürzen und Ihr Benutzer wird weinen unfähig zu verstehen, was schief gelaufen ist.

    Sie haben Tonnen von Optionen hier, ich würde Ihnen empfehlen zu lesen here.

    private int calculateSum(string text1, string text2, string text3, string text4, string text5, string text6, string text7, string text8) 
    { 
        int A, B, C, D, E, F, G, H; 
    
        try 
        { 
         A = int.Parse(TextBox1); 
         B = int.Parse(TextBox2); 
         C = int.Parse(TextBox3); 
         D = int.Parse(TextBox4); 
         E = int.Parse(TextBox5); 
         F = int.Parse(TextBox6); 
         G = int.Parse(TextBox7); 
         H = int.Parse(TextBox8); 
        } 
        catch (FromatException) 
        { 
         MessageBox.Show("Ooops! You entered an invalid number."); 
        } 
        catch (OverflowEcxeption) 
        { 
         MessageBox.Show("Ooops! You entered an number that it too big."); 
        } 
        return A + B + C + D + E + F + G + H; 
    } 
    
  5. Können wir es besser machen? Nun ja, calculateSum scheint zu klobig mit all diesen Argumenten. Lasst es uns verbessern. Weclome zum params Stichwort:

    private int calculateSum(params string[] arguments) 
    { 
        int sum = 0; 
    
        try 
        { 
         foreach (var arg in arguments) 
         { 
          sum += int.Parse(arg); 
         } 
        } 
        catch (FromatException) 
        { 
         MessageBox.Show("Ooops! You entered an invalid number."); 
        } 
        catch (OverflowEcxeption) 
        { 
         MessageBox.Show("Ooops! You entered an number that it too big."); 
        } 
    
        return sum; 
    } 
    
  6. Best Practices wird Ihnen sagen, int.TryParse() statt int.Parse() zu beginnen. Außerdem wird es das perfekte Beispiel liefern, um das Schlüsselwort out zu verstehen. Schau dir an, wie es funktioniert, understand es. Das überlasse ich dir.

+0

Vielen Dank, das macht sehr viel Sinn, ich weiß wirklich zu schätzen, wie viel Detail Sie sich vorgenommen haben, um zu erklären, was ich falsch gemacht habe. Danke, ich werde alles sehen, was du weiter gesagt hast – Stefan

Verwandte Themen