Menu

C# Array: deklarieren, Length, sortieren, 2D- und Jagged Arrays

Ein C#-Array ist ein Block fester Größe mit Elementen eines Typs. Lerne, wie du Arrays deklarierst und initialisierst, Length liest, mit der Klasse Array sortierst und suchst, sie sicher kopierst und mit 2D- und Jagged Arrays arbeitest.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Ein Array enthält eine feste Anzahl von Elementen eines Typs, die im Speicher nebeneinander liegen. Du wählst die Länge beim Erzeugen, liest und schreibst Elemente über einen nullbasierten Index, und die Länge ändert sich danach nie.

Ein Array deklarieren und initialisieren

Der Typ eines Arrays ist der Elementtyp gefolgt von []. Es gibt mehrere Wege, eines zu erzeugen:

Ausgabe:

90, 0, 0, 72
Ben
2 prices, 3 days

new int[4] füllt jedes Element mit dem Standardwert des Typs: 0 für Zahlen, false für bool, null für Strings und andere Referenztypen. Die Kurzform { "Ana", "Ben" } funktioniert nur in einer Deklaration; bei der Zuweisung an eine bestehende Variable brauchst du names = new[] { "Dev", "Eli" };.

Length, Indizierung und das letzte Element

Indizes reichen von 0 bis Length - 1. Length ist eine Property, hat also keine Klammern (anders als die LINQ-Methode Count()).

Ausgabe:

Count: 5
First: 18
Last: 16
Caught IndexOutOfRangeException

Lesen oder Schreiben außerhalb der Grenzen wirft zur Laufzeit IndexOutOfRangeException; der Compiler erkennt das nicht. Die übliche Ursache ist eine Schleifenbedingung i <= arr.Length statt i < arr.Length.

Ab C# 8 gibt es Indizes vom Ende und Bereichssyntax, die für das letzte Element und für Ausschnitte kürzer sind:

int last = temps[^1];        // 16
int[] middle = temps[1..4];  // { 21, 25, 19 }, a new array

Ein Array durchlaufen

Eine for-Schleife gibt dir den Index; foreach gibt dir jedes Element und ist die klarere Wahl, wenn du nur liest.

Ausgabe:

4.95 | 13.20 | 3.58
Total: 21.73

Die foreach-Variable ist schreibgeschützt: p = 0; in der Schleife ist ein Kompilierfehler. Um Elemente zu ändern, durchlaufe das Array mit einem Index.

Sortieren, umkehren und suchen

Die statische Klasse Array enthält die Hilfsmethoden. Array.Sort sortiert an Ort und Stelle und gibt nichts zurück, die ursprüngliche Reihenfolge ist also weg.

Ausgabe:

Ascending:  60, 72, 79, 88, 95
Descending: 95, 88, 79, 72, 60
Index of 60: 4
Index of 99: -1
Any above 90: True
First below 75: 72
Ana, ben, chloe
fig, kiwi, banana

Array.IndexOf gibt -1 zurück, wenn der Wert fehlt. Array.Find gibt den Standardwert des Typs zurück (hier 0), wenn nichts passt, was bei Zahlen mehrdeutig ist; nimm Array.FindIndex, wenn das wichtig ist. Eine absteigende Sortierung in einem Aufruf ist Array.Sort(scores, (a, b) => b.CompareTo(a)).

Wenn du das sortierte Ergebnis brauchst, ohne das Original anzufassen, gibt LINQ ein neues Array zurück: var sorted = scores.OrderBy(s => s).ToArray();. Siehe LINQ.

Größe ändern: Ein Array kann nicht wachsen

Die Länge ist fest. Array.Resize erzeugt ein neues Array der gewünschten Größe, kopiert die Elemente und aktualisiert die Variable, die du per ref übergibst.

Ausgabe:

4
2
True
False

Jedes Resize kopiert jedes Element. Ein Array in einer Schleife Element für Element wachsen zu lassen ist langsam, und genau das erledigt List<T> effizienter für dich, indem es sein internes Array verdoppelt.

Arrays sind Referenztypen: kopieren

Ein Array einer anderen Variable zuzuweisen kopiert die Referenz, nicht die Elemente. Beide Namen zeigen dann auf dasselbe Array.

Ausgabe:

100
2
0, 100, 2, 3, 0

Dasselbe gilt, wenn du ein Array an eine Methode übergibst: Die Methode kann die Elemente des Aufrufers ändern. Clone, Array.Copy, CopyTo und ToArray() aus LINQ erzeugen alle eine flache Kopie. Bei einem Array von Objekten enthält das neue Array Referenzen auf dieselben Objekte, eine Änderung an copy[0].Name ändert also weiterhin, was original[0] sieht.

Arrays mit == zu vergleichen vergleicht Referenzen. Um Inhalte zu vergleichen, nimm a.SequenceEqual(b) aus System.Linq.

2D-Arrays (mehrdimensional)

Ein rechteckiges Raster wird mit einem Komma in den eckigen Klammern deklariert. Indiziere es mit [row, col].

Ausgabe:

Rows: 2
Cols: 3
Length: 6, Rank: 2
. X . 
. . X 

Length ist bei einem 2D-Array die Gesamtzahl der Elemente (6 bei einem Raster von 2 mal 3), deshalb verwenden verschachtelte Schleifen GetLength(0) und GetLength(1). Rank ist die Anzahl der Dimensionen. Drei Dimensionen funktionieren genauso: new int[4, 4, 4] und cube[x, y, z]. Ein foreach über ein 2D-Array besucht jedes Element Zeile für Zeile.

Jagged Arrays (Arrays von Arrays)

Ein Jagged Array int[][] ist ein Array, dessen Elemente selbst Arrays sind, und jedes innere Array kann seine eigene Länge haben. Es passt zu Daten wie „Bestellungen pro Kunde“, bei denen sich die Zeilen in der Größe unterscheiden.

Ausgabe:

Customer 0: 2 orders, 20, 35
Customer 1: 1 orders, 12
Customer 2: 4 orders, 8, 15, 40, 22
True

new int[3][] erzeugt nur das äußere Array; jede Zeile beginnt als null, und orders[0][0] vor der Zuweisung einer Zeile wirft NullReferenceException. Die Syntax new int[3][4] ist nicht erlaubt; du erzeugst jede Zeile selbst.

Nimm [,] für ein echtes Raster (ein Spielbrett, eine Matrix, Pixel) und [][], wenn Zeilen unterschiedlich lang sind oder du ganze Zeilen austauschen willst.

Array gegenüber List

Array T[]List<T>
GrößeBei der Erzeugung festgelegtWächst und schrumpft
AnzahlProperty LengthProperty Count
Hinzufügen oder entfernenNicht möglich (nur Array.Resize)Add, Insert, Remove
Mehrdimensional[,] und [][]Nur Listen von Listen
Typischer EinsatzBekannte Größe, Nachschlagetabellen, PufferCollections, die sich ändern

Die Umwandlung ist in beide Richtungen ein Aufruf: new List<int>(arr) oder arr.ToList() und list.ToArray(). List<T> ist die wachsende Variante.

Häufige Fehler

  • i <= arr.Length in einer Schleife. Der letzte gültige Index ist Length - 1; das wirft IndexOutOfRangeException.
  • Das Array direkt ausgeben. Console.WriteLine(arr) gibt System.Int32[] aus; nimm string.Join.
  • Erwarten, dass Array.Sort das sortierte Array zurückgibt. Es gibt void zurück und sortiert an Ort und Stelle.
  • Mit = kopieren. Das kopiert die Referenz; nimm Clone() oder ToArray().
  • Zeilen eines Jagged Arrays verwenden, bevor sie erzeugt sind. Jede Zeile von new T[n][] ist null, bis sie zugewiesen wird.
  • Length für die Zeilen eines 2D-Arrays verwenden. Es zählt jedes Element; nimm GetLength(0).

Häufig gestellte Fragen

Wie bekomme ich in C# die Länge eines Arrays?

Mit der Property Length: scores.Length. Sie ist eine Property, keine Methode, also ohne Klammern. Bei einem 2D-Array ist Length die Gesamtzahl der Elemente; nimm GetLength(0) für die Anzahl der Zeilen und GetLength(1) für die Anzahl der Spalten.

Wie sortiere ich in C# ein Array?

Array.Sort(arr) sortiert das Array an Ort und Stelle aufsteigend. Für absteigende Reihenfolge rufe nach dem Sortieren Array.Reverse(arr) auf oder übergib einen Vergleich: Array.Sort(arr, (a, b) => b.CompareTo(a)). Um eine sortierte Kopie zu bekommen und das Original zu behalten, nimm LINQ: arr.OrderBy(x => x).ToArray().

Was ist der Unterschied zwischen einem 2D-Array und einem Jagged Array in C#?

Ein 2D-Array int[,] ist ein einziger rechteckiger Block: Jede Zeile hat dieselbe Anzahl Spalten, und du indizierst es als grid[row, col]. Ein Jagged Array int[][] ist ein Array von Arrays: Jede Zeile ist ein eigenes Array mit eigener Länge, und du indizierst es als rows[i][j]. Jede Zeile eines Jagged Arrays muss vor der Verwendung erzeugt werden, sonst ist sie null.

Kann man in C# die Größe eines Arrays ändern?

Nein. Die Länge eines Arrays steht bei seiner Erzeugung fest. Array.Resize(ref arr, newSize) sieht aus, als würde es die Größe ändern, allokiert aber ein neues Array, kopiert die Elemente und lässt deine Variable auf das neue zeigen. Wenn sich die Größe oft ändert, nimm eine List<T>.

Warum zeigt die Ausgabe eines Arrays System.Int32[]?

Console.WriteLine(arr) ruft arr.ToString() auf, und Arrays überschreiben das nicht, also bekommst du den Typnamen. Verbinde die Elemente stattdessen zu einem String: Console.WriteLine(string.Join(", ", arr)).

Soll ich in C# ein Array oder eine List verwenden?

Nimm ein Array, wenn die Anzahl der Elemente bekannt und fest ist, etwa die 12 Monate oder ein Spielbrett. Nimm List<T>, wenn im Lauf der Zeit Elemente hinzukommen oder wegfallen. Beide indizieren in konstanter Zeit, und eine List<T> speichert ihre Elemente intern in einem Array.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S