Entwickler-Ecke
Basistechnologien - Array mit unbekannter Größe möglich?
Fauk - Mi 15.05.13 10:45
Titel: Array mit unbekannter Größe möglich?
Hallo werte Community,
Ich bin noch ganz neu was C# angeht und bisher verwirren mich die Arrays noch ein wenig. Ich benutze Visual Studio 2012 und möchte ein einfaches Winforms Program schreiben. In diesem Programm gibt es ein Label, bisher zur Ausgabe, und 9 Buttons die jeweils den Wert von 0 - 9, also wie ein Numpad, betragen. Der Benutzer soll jetzt einfach nur auf die Buttons klicken können und damit eine Zahl zusammen setzen. Klickt er bspw. auf den Button 1 und dann auf die Buttons 2 und 4 soll im Label die Zahl 124 Erscheinen.
Da ich wie gesagt noch Anfänger bin wollte ich das ganze mit Arrays realisieren. Wobei wir aber schon bei meinem ersten Problem sind. Da ich nicht weiß wieviele Zahlen der Benutzer letztendlich eintippt benötige ich ein Array mit einer unbekannten Größe. Wie kann ich das in C# realisieren? Ursprünglich wollte ich in der Deklaration wie z.B:
C#-Quelltext
1:
| int[] Eingabe = new int[10]; |
Die "10" durch eine Variable ersetzen, die sich mit jeder Eingabe erhöht. Allerdings funktioniert das soweit ja nicht, da zumindest Visual Studio es nicht erlaubt ein Array mit einer Variable als Größe zu definieren. Deshalb meine Frage jetzt, was ich tun muss damit ich ein Array deklarieren kann das vom Typ Int ist und eine beliebige Größe hat.
Meine nächste Frage wäre dann noch falls der Benutzer nun 3 Eingaben gemacht hat, bspw. die "1", "4" sowie die "8", wie füge ich diese in einer Variable zusammen? So das dann letztendlich die 3 Array Werte zu einer neuen Variable mit dem Wert 148 zusammengeführt werden?
Moderiert von
Christian S.: C#-Tags hinzugefügt
Christian S. - Mi 15.05.13 10:58
Hallo und :welcome:!
Statt eines Arrays würde ich hier eine
List<int> verwenden, die ist genau dazu gemacht :-)
C#-Quelltext
1: 2: 3: 4: 5:
| var eingabe = new List<int>();
eingabe.Add(5); eingabe.Add(7); |
Für die zweite Frage erstelle bitte einen neuen Thread, damit das hier nicht durcheinander geht. Danke Dir! :zustimm:
Viele Grüße
Christian
Fauk - Mi 15.05.13 11:28
Hallo und danke für die schnelle Antwort :)
Wenn ich das jetzt richtig verstanden habe, erstellt das ganze eine Liste mit beliebig vielen Werten und der Code:
eingabe.Add(5);
fügt der Liste bspw. eine 5 hinzu? Falls ja wie kann ich die Liste dann auslesen bzw. das Ergebnis in ein Label schreiben?
Christian S. - Mi 15.05.13 12:08
Das hast Du richtig verstanden :-)
Du kannst auf die Liste zugreifen wie auf ein Array, also
eingabe[0] liefert Dir das erste Element der Liste,
eingabe[1] das Zweite und so weiter.
Alle Elemente in einer Schleife auslesen und auf der Konsole ausgeben wäre dann z.B.
C#-Quelltext
1: 2:
| for(int i = 0; i < eingabe.Count; i++) Console.WriteLine(eingabe[i]); |
Fauk - Mi 15.05.13 12:50
Nochmal Danke Christian,
Das ganze funktioniert soweit auch. Mit der Ausnahme das ich das ganze nicht in einer Konsole sondern in einem Label ausgeben will. Ich stehe aber momentan irgendwie vor dem Problem das wenn ich List.Count eingebe er mir die richtige Anzahl an Werten anzeigt. Also bspw. 11 Listenwerte. Wenn ich die Forschleife jetzt aber anwende gibt er mir immer nur die letzte Eingabe aus, woran kann das liegen?
bisheriger Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace Bildschirmtastatur { public partial class Form1 : Form { int unten; List<int> Eingabe = new List<int>();
public Form1() { InitializeComponent(); }
private void cmd0_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(0); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(0); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd1_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(1); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(1); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd2_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(2); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(2); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd3_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(3); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(3); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd4_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(4); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(4); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd5_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(5); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(5); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd6_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(6); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(6); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd7_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(7); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(7); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd8_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(8); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(8); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void cmd9_Click(object sender, EventArgs e) { if (unten == 1) { Eingabe.Add(9); for (int i = 0; i < Eingabe.Count; i++) lblunten.Text = "Listenwert:" + Eingabe[i]; } else { Eingabe.Add(9); for (int i = 0; i < Eingabe.Count; i++) lbloben.Text = "Listenwert:" + Eingabe[i]; } }
private void lbloben_Click(object sender, EventArgs e) { unten = 0; cmd0.Visible = true; cmd1.Visible = true; cmd2.Visible = true; cmd3.Visible = true; cmd4.Visible = true; cmd5.Visible = true; cmd6.Visible = true; cmd7.Visible = true; cmd8.Visible = true; cmd9.Visible = true; }
private void lblunten_Click(object sender, EventArgs e) { unten = 1; cmd0.Visible = true; cmd1.Visible = true; cmd2.Visible = true; cmd3.Visible = true; cmd4.Visible = true; cmd5.Visible = true; cmd6.Visible = true; cmd7.Visible = true; cmd8.Visible = true; cmd9.Visible = true; }
private void cmdende_Click(object sender, EventArgs e) { Close(); }
private void lblanzeigen_Click(object sender, EventArgs e) {
} } } |
Ralf Jansen - Mi 15.05.13 12:54
Weil du dem Label.Text immer wieder einen neuen Text zuweist. Bei deinen 11 Elementen überschreibst du den Inhalt also 10 mal und siehst nur den letzten zugewiesenen.
Wenn du den Label Text ergänzen anstatt überschreiben willst nimm ein += anstatt nur =.
C#-Quelltext
1:
| label.Text += "meinLieberErgänzenderText"; |
Th69 - Mi 15.05.13 13:13
Hallo Fuak,
und um Codeduplizierung zu vermeiden, solltest du diesen Code in eine eigene Methode auslagern:
C#-Quelltext
1: 2: 3: 4: 5:
| void UpdateText() { lbloben.Text = "Listenwert:"; for (int i = 0; i < Eingabe.Count; i++) lbloben.Text += Eingabe[i]; |
Auch wenn der Code mit der Liste ein gutes Programmierexampel ist, wäre in diesem konkreten Fall wohl ein
string als Datenspeicher besser (da dieser ebenfalls +=, Index-Operator sowie direkte Ausgabe unterstützt).
Fauk - Mi 15.05.13 13:41
Danke Ralf, hat mit einer kleinen Änderung wunderbar funktioniert :)
@Th69 Das werde ich machen, sobald das Program einmal das gemacht hat was ich von ihm will :) Aber der Tipp behalte ich mir definitiv im Hinterkopf allein schon um das ganze zu entschlacken.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!