Menu

Array C#: Deklarasi, Length, Sort, Array 2D, dan Jagged Array

Array C# adalah blok elemen bertipe sama dengan ukuran tetap. Pelajari cara mendeklarasikan dan menginisialisasi array, membaca Length, mengurutkan dan mencari dengan class Array, menyalinnya dengan aman, serta memakai array 2D dan jagged array.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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>
UkuranTetap sejak dibuatBisa membesar dan mengecil
Jumlah elemenProperty LengthProperty Count
Menambah atau menghapusTidak bisa (hanya Array.Resize)Add, Insert, Remove
Multidimensi[,] dan [][]Hanya list berisi list
Penggunaan umumUkuran yang diketahui, tabel pencarian, bufferKoleksi 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.Length di dalam loop. Index valid terakhir adalah Length - 1; kode ini melempar IndexOutOfRangeException.
  • Mencetak array secara langsung. Console.WriteLine(arr) mencetak System.Int32[]; pakai string.Join.
  • Mengira Array.Sort mengembalikan array yang sudah terurut. Method ini mengembalikan void dan mengurutkan di tempat.
  • Menyalin dengan =. Cara itu menyalin reference; pakai Clone() atau ToArray().
  • Memakai baris jagged array sebelum membuatnya. Setiap baris dari new T[n][] bernilai null sampai di-assign.
  • Memakai Length untuk jumlah baris array 2D. Property ini menghitung semua elemen; pakai GetLength(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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai