JuyJuka
Hallo Community,
die Frage nach variablen oder dynamischen Variablennamen steht meist im Zusammenhang mit einer Frage wie:
Die Fragen sind berechtigt. C# (und .NET) bieten natürlich die Möglichkeit, mehrere gleichartige Daten gemeinsam zu verarbeiten. Variablennamen zur Laufzeit zusammenzusetzen ist jedoch nicht möglich.
Im Anschluss wird zunächst der der allgemeine Fall behandelt. Für Windows Forms und WPF gibt es meistens bessere Lösungen. Auf diese wird weiter
unten eingegangen.
Warum man keine Variablennamen zur Laufzeit zusammensetzen kann?
Es ist nicht möglich, weil .NET eine statisch typisierte Programmiersprache ist. Aber es ist auch nicht notwendig, da .NET für die Verarbeitung gleichartiger Daten Listen zur Verfügung stellt.
Was ist eine Liste?
In .NET ist eine Liste genau das, was man auch im echten Leben darunter versteht: nämlich eine Sammlung von Daten. Wesentlich ist: Man kann alle Elemente einer Liste durchgehen und jedes Element in der Liste bearbeiten!
Was hilft mir das? (oder: die Lösung)
Um also das Problem zu lösen, müssen wir unsere vielen Variablen in eine Liste aufnehmen, die wir mit C# durchlaufen können.
Die einfachste (und schnellste) aller Listen ist das Array. Anstatt viele einzelne Variablen zu deklarieren, erzeugen wir ein Array und befüllen es mit unseren Werten:
Wenn die Werte, mit denen das Array gefüllt werden soll, von Anfang bekannt sind, geht es stattdessen(!) noch einfacher.
Anschließend können wir auf die Elemente der Liste in einer Schleife zugreifen.
Im Beispiel geben wir einfach nur die drei Texte aus, aber wir könnten auch etwas anderes machen. Bei einem Array von Zahlen (int[] zahlen = new int[3];) könnten wir auch rechnen.
Ein Array ist eine Liste fester Länge! Es hat immer genau so viele Elemente, wie bei der Deklaration angegeben. Wenn wir vorher nicht wissen, wie lang eine Liste wird, können wir System.Collections.Generic.List<T> verwenden.
Ausgeben können wir die Liste wie beim Array gezeigt, nur dass wir bei der for-Schleife Count statt Length schreiben müssen. Bei der foreach-Schleife gibt es keinen Unterschied.
In besonderen Fällen kann es sinnvoll sein, eine Hashtable (bis .NET 1.1) bzw. ein Dictionary (ab .NET 2.0) oder eine der anderen Auflistungsklassen (Collections) zu verwenden, aber meistens wird Array oder List<T> am besten passen.
Ergänzende Hinweise und weiterführende Informationen
Dieser Text ist eine Gemeinschaftsproduktion von ErfinderDesRades, herbivore, JuyJuka und zero_x. Darin sind Verbesserungsvorschläge von dN!3L, FZelle, gfoidl, JAck30lena, MarsStein, michlG, ujr eingeflossen. Alle Namen in alphabetischer Reihenfolge.
die Frage nach variablen oder dynamischen Variablennamen steht meist im Zusammenhang mit einer Frage wie:
| Ich habe mehrere Variablen deren Namen einfach durchnummeriert sind (z.B. text1, text2, ... text10). Wie kann ich diese in einer Schleife ansprechen? Kann ich die Zahl im Variablennamen einfach durch die Laufvariable der Schleife ersetzen? |
Die Fragen sind berechtigt. C# (und .NET) bieten natürlich die Möglichkeit, mehrere gleichartige Daten gemeinsam zu verarbeiten. Variablennamen zur Laufzeit zusammenzusetzen ist jedoch nicht möglich.
Im Anschluss wird zunächst der der allgemeine Fall behandelt. Für Windows Forms und WPF gibt es meistens bessere Lösungen. Auf diese wird weiter
unten eingegangen.Warum man keine Variablennamen zur Laufzeit zusammensetzen kann?
Es ist nicht möglich, weil .NET eine statisch typisierte Programmiersprache ist. Aber es ist auch nicht notwendig, da .NET für die Verarbeitung gleichartiger Daten Listen zur Verfügung stellt.
Was ist eine Liste?
In .NET ist eine Liste genau das, was man auch im echten Leben darunter versteht: nämlich eine Sammlung von Daten. Wesentlich ist: Man kann alle Elemente einer Liste durchgehen und jedes Element in der Liste bearbeiten!
Was hilft mir das? (oder: die Lösung)
Um also das Problem zu lösen, müssen wir unsere vielen Variablen in eine Liste aufnehmen, die wir mit C# durchlaufen können.
Die einfachste (und schnellste) aller Listen ist das Array. Anstatt viele einzelne Variablen zu deklarieren, erzeugen wir ein Array und befüllen es mit unseren Werten:
C#-Code: |
string[] texte = new string[3]; // hier deklarieren wir Platz für 3 Strings,
|
Wenn die Werte, mit denen das Array gefüllt werden soll, von Anfang bekannt sind, geht es stattdessen(!) noch einfacher.
C#-Code: |
string[] texte = new string[] { "Hallo", "Welt", "!");
|
Anschließend können wir auf die Elemente der Liste in einer Schleife zugreifen.
C#-Code: |
// Alle Elemente in einer for-Schleife durchlaufen
|
Im Beispiel geben wir einfach nur die drei Texte aus, aber wir könnten auch etwas anderes machen. Bei einem Array von Zahlen (int[] zahlen = new int[3];) könnten wir auch rechnen.
Ein Array ist eine Liste fester Länge! Es hat immer genau so viele Elemente, wie bei der Deklaration angegeben. Wenn wir vorher nicht wissen, wie lang eine Liste wird, können wir System.Collections.Generic.List<T> verwenden.
C#-Code: |
List<string> texte = new List<string>(); // eine leere Liste von Strings deklarieren
|
Ausgeben können wir die Liste wie beim Array gezeigt, nur dass wir bei der for-Schleife Count statt Length schreiben müssen. Bei der foreach-Schleife gibt es keinen Unterschied.
In besonderen Fällen kann es sinnvoll sein, eine Hashtable (bis .NET 1.1) bzw. ein Dictionary (ab .NET 2.0) oder eine der anderen Auflistungsklassen (Collections) zu verwenden, aber meistens wird Array oder List<T> am besten passen.
Ergänzende Hinweise und weiterführende Informationen
- ArrayList ist völlig veraltet - Da das Framework seit 2005 die typisierte List<T> vorhält, ist es sehr schlechter Stil, weiterhin die untypisierte ArrayList zu verwenden.
Liste,
Liste (Datenstruktur)
Übersicht über Auflistungsklassen,
Auswählen einer Auflistungsklasse,
Häufig verwendete Auflistungsklassen
IEnumerable,
Array,
List<T>,
Dictionary<TKey,TValue>
Schleifentypen (for, foreach, ...)
Referenztypen und das Gegenteil
Werttypen
typisierte Programmiersprache
Dieser Text ist eine Gemeinschaftsproduktion von ErfinderDesRades, herbivore, JuyJuka und zero_x. Darin sind Verbesserungsvorschläge von dN!3L, FZelle, gfoidl, JAck30lena, MarsStein, michlG, ujr eingeflossen. Alle Namen in alphabetischer Reihenfolge.
