Array menyimpan sejumlah elemen bertipe sama dengan jumlah yang tetap, disimpan berdampingan di memori. Kamu menentukan panjangnya saat membuatnya, membaca dan menulis elemen lewat index yang dimulai dari nol, dan panjangnya tidak pernah berubah setelah itu.
Mendeklarasikan dan menginisialisasi array
Tipe sebuah array adalah tipe elemennya diikuti []. Ada beberapa cara untuk membuatnya:
Output:
90, 0, 0, 72
Ben
2 prices, 3 days
new int[4] mengisi setiap elemen dengan nilai default tipenya: 0 untuk angka, false untuk bool, null untuk string dan tipe reference lainnya. Bentuk singkat { "Ana", "Ben" } hanya berlaku di deklarasi; saat meng-assign ke variabel yang sudah ada, kamu perlu menulis names = new[] { "Dev", "Eli" };.
Length, index, dan elemen terakhir
Index berjalan dari 0 sampai Length - 1. Length adalah property, jadi tidak pakai tanda kurung (berbeda dengan method Count() milik LINQ).
Output:
Count: 5
First: 18
Last: 16
Caught IndexOutOfRangeException
Membaca atau menulis di luar batas akan melempar IndexOutOfRangeException saat program berjalan; compiler tidak menangkapnya. Penyebab paling umum adalah kondisi loop yang ditulis i <= arr.Length, bukan i < arr.Length.
C# 8 ke atas menambahkan sintaks index dari belakang dan range, yang lebih singkat untuk elemen terakhir dan untuk potongan array:
int last = temps[^1]; // 16
int[] middle = temps[1..4]; // { 21, 25, 19 }, a new array
Perulangan pada array
for loop memberimu index; foreach memberimu setiap elemen dan lebih jelas saat kamu hanya membaca.
Output:
4.95 | 13.20 | 3.58
Total: 21.73
Variabel foreach bersifat read-only: p = 0; di dalam loop menghasilkan error saat compile. Untuk mengubah elemen, lakukan perulangan dengan index.
Mengurutkan, membalik, dan mencari
Class static Array menyediakan method pembantunya. Array.Sort mengurutkan di tempat dan tidak mengembalikan apa pun, jadi urutan aslinya hilang.
Output:
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 mengembalikan -1 saat nilainya tidak ada. Array.Find mengembalikan nilai default tipenya (0 di sini) saat tidak ada yang cocok, dan ini ambigu untuk angka; pakai Array.FindIndex kalau hal itu penting. Mengurutkan secara turun dalam satu panggilan ditulis Array.Sort(scores, (a, b) => b.CompareTo(a)).
Kalau kamu butuh hasil terurut tanpa menyentuh array aslinya, LINQ mengembalikan array baru: var sorted = scores.OrderBy(s => s).ToArray();. Lihat LINQ.
Mengubah ukuran: array tidak bisa bertambah besar
Panjangnya tetap. Array.Resize membuat array baru dengan ukuran yang diminta, menyalin elemennya, dan memperbarui variabel yang kamu berikan dengan ref.
Output:
4
2
True
False
Setiap resize menyalin semua elemen. Memperbesar array satu item demi satu item di dalam loop itu lambat, dan justru itulah yang dilakukan List<T> untukmu dengan lebih efisien, yaitu dengan menggandakan array internalnya.
Array adalah tipe reference: menyalin
Meng-assign array ke variabel lain menyalin reference-nya, bukan elemennya. Kedua nama itu lalu menunjuk ke array yang sama.
Output:
100
2
0, 100, 2, 3, 0
Hal yang sama berlaku saat kamu mengirim array ke sebuah method: method itu bisa mengubah elemen milik pemanggil. Clone, Array.Copy, CopyTo, dan ToArray() milik LINQ semuanya membuat salinan dangkal (shallow copy). Untuk array berisi object, array baru menyimpan reference ke object yang sama, jadi mengubah copy[0].Name tetap mengubah apa yang terlihat dari original[0].
Membandingkan array dengan == berarti membandingkan reference. Untuk membandingkan isinya, pakai a.SequenceEqual(b) dari System.Linq.
Array 2D (multidimensi)
Grid persegi panjang dideklarasikan dengan koma di dalam kurung siku. Akses elemennya dengan [row, col].
Output:
Rows: 2
Cols: 3
Length: 6, Rank: 2
. X .
. . X
Length pada array 2D adalah jumlah total elemen (6 untuk grid 2 kali 3), itulah sebabnya loop bersarang memakai GetLength(0) dan GetLength(1). Rank adalah jumlah dimensinya. Tiga dimensi bekerja dengan cara yang sama: new int[4, 4, 4] dan cube[x, y, z]. foreach pada array 2D mengunjungi setiap elemen baris demi baris.
Jagged array (array berisi array)
Jagged array int[][] adalah array yang elemennya juga berupa array, dan setiap array di dalamnya bisa punya panjang sendiri. Bentuk ini cocok untuk data seperti "pesanan per pelanggan" yang ukuran barisnya berbeda-beda.
Output:
Customer 0: 2 orders, 20, 35
Customer 1: 1 orders, 12
Customer 2: 4 orders, 8, 15, 40, 22
True
new int[3][] hanya membuat array luarnya; setiap baris dimulai sebagai null, dan orders[0][0] sebelum sebuah baris di-assign akan melempar NullReferenceException. Sintaks new int[3][4] tidak diizinkan; kamu membuat setiap barisnya sendiri.
Pakai [,] untuk grid sungguhan (papan permainan, matriks, piksel) dan [][] saat baris-barisnya punya panjang berbeda atau kamu ingin menukar seluruh baris.
Array vs List
Array T[] | List<T> | |
|---|---|---|
| Ukuran | Tetap sejak dibuat | Bisa membesar dan mengecil |
| Jumlah elemen | Property Length | Property Count |
| Menambah atau menghapus | Tidak bisa (hanya Array.Resize) | Add, Insert, Remove |
| Multidimensi | [,] dan [][] | Hanya list berisi list |
| Penggunaan umum | Ukuran yang diketahui, tabel pencarian, buffer | Koleksi yang berubah-ubah |
Konversi ke dua arah cukup dengan satu panggilan: new List<int>(arr) atau arr.ToList(), dan list.ToArray(). List<T> adalah versi yang bisa bertambah besar.
Kesalahan umum
i <= arr.Lengthdi dalam loop. Index valid terakhir adalahLength - 1; kode ini melemparIndexOutOfRangeException.- Mencetak array secara langsung.
Console.WriteLine(arr)mencetakSystem.Int32[]; pakaistring.Join. - Mengira
Array.Sortmengembalikan array yang sudah terurut. Method ini mengembalikanvoiddan mengurutkan di tempat. - Menyalin dengan
=. Cara itu menyalin reference; pakaiClone()atauToArray(). - Memakai baris jagged array sebelum membuatnya. Setiap baris dari
new T[n][]bernilainullsampai di-assign. - Memakai
Lengthuntuk jumlah baris array 2D. Property ini menghitung semua elemen; pakaiGetLength(0).
Pertanyaan yang sering diajukan
Bagaimana cara mendapatkan panjang array di C#?
Pakai property Length: scores.Length. Ini property, bukan method, jadi tidak pakai tanda kurung. Untuk array 2D, Length adalah jumlah total elemen; pakai GetLength(0) untuk jumlah baris dan GetLength(1) untuk jumlah kolom.
Bagaimana cara mengurutkan array di C#?
Array.Sort(arr) mengurutkan array di tempat secara naik (ascending). Untuk urutan turun, panggil Array.Reverse(arr) setelah mengurutkan, atau berikan fungsi pembanding: Array.Sort(arr, (a, b) => b.CompareTo(a)). Untuk mendapat salinan yang terurut sambil mempertahankan array aslinya, pakai LINQ: arr.OrderBy(x => x).ToArray().
Apa bedanya array 2D dan jagged array di C#?
Array 2D int[,] adalah satu blok persegi panjang: setiap baris punya jumlah kolom yang sama, dan kamu mengaksesnya dengan grid[row, col]. Jagged array int[][] adalah array berisi array: setiap baris adalah array terpisah yang bisa punya panjang sendiri, dan kamu mengaksesnya dengan rows[i][j]. Setiap baris jagged array harus dibuat dulu sebelum dipakai, kalau tidak nilainya null.
Apakah ukuran array bisa diubah di C#?
Tidak. Panjang array ditetapkan saat array dibuat. Array.Resize(ref arr, newSize) terlihat seperti mengubah ukuran, padahal ia mengalokasikan array baru, menyalin elemennya, lalu mengarahkan variabelmu ke array baru itu. Kalau ukurannya sering berubah, pakai List<T>.
Kenapa mencetak array menampilkan System.Int32[]?
Console.WriteLine(arr) memanggil arr.ToString(), dan array tidak meng-override method itu, jadi yang kamu dapat adalah nama tipenya. Gabungkan elemennya menjadi satu string: Console.WriteLine(string.Join(", ", arr)).
Sebaiknya pakai array atau List di C#?
Pakai array saat jumlah elemennya sudah diketahui dan tetap, misalnya 12 bulan atau papan permainan. Pakai List<T> saat elemen ditambah atau dihapus seiring waktu. Keduanya bisa diakses lewat index dalam waktu konstan, dan List<T> sebenarnya menyimpan elemennya di dalam sebuah array.