Menu

for Loop C#: Sintaks, Hitung Mundur, Nested Loop, dan Jebakannya

Cara kerja for loop di C#: initializer, kondisi, dan iterator, menghitung mundur dan melompat dengan langkah tertentu, beberapa variabel loop, perulangan pada array lewat index, nested loop, for(;;), serta bug off-by-one dan menghapus item saat iterasi.

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

for loop mengulang sebuah blok selama kondisinya bernilai true, dengan bagian persiapan dan langkahnya ditulis di header loop. Inilah loop yang dipakai saat kamu menghitung: jumlah pengulangan yang tetap, atau setiap index sebuah array.

Output:

Lap 1 of 5
Lap 2 of 5
Lap 3 of 5
Lap 4 of 5
Lap 5 of 5

Cara ketiga bagian berjalan

for (initializer; condition; iterator) dijalankan dengan urutan yang tetap:

  1. Initializer (int i = 1) dijalankan sekali, sebelum yang lain.
  2. Kondisi (i <= 5) dicek. Kalau bernilai false, loop berakhir dan body-nya tidak dijalankan lagi.
  3. Body dijalankan.
  4. Iterator (i++) dijalankan, lalu kendali kembali ke langkah 2.

Karena kondisinya dicek sebelum setiap iterasi, for loop bisa berjalan nol kali: for (int i = 10; i < 5; i++) tidak pernah masuk ke body-nya. Loop di atas berperilaku seperti while loop ini:

int i = 1;
while (i <= 5)
{
    Console.WriteLine($"Lap {i} of 5");
    i++;
}

Kedua bentuk ini berbeda di satu detail: continue di dalam body for tetap menjalankan iterator, sedangkan di versi while ini ia akan melompati i++, jadi loop akan menguji i yang sama lagi dan bisa berputar selamanya. Variabel yang dideklarasikan di initializer hanya ada di dalam loop. Kalau kamu butuh nilai akhirnya setelah loop, deklarasikan variabel itu sebelum loop: int i; for (i = 0; ...; i++) { }.

Menghitung mundur dan melompat

Iterator bisa berupa ekspresi apa saja. Kurangi untuk menghitung mundur, tambahkan lebih dari satu untuk melompat, atau kalikan untuk deret geometri:

Output:

3... 2... 1... liftoff
 00 15 30 45
 1 10 100 1000

Pastikan iterator-nya bergerak ke arah yang membuat kondisinya menjadi false. for (int i = 0; i < 10; i--) menghitung menjauh dari 10 dan baru berhenti saat i berputar balik setelah dua miliar iterasi.

Perulangan pada array lewat index

Array punya Length, list punya Count, dan index yang valid berjalan dari 0 sampai satu kurangnya dari angka itu. Index memberimu sesuatu yang tidak dimiliki foreach: akses ke posisinya, ke elemen tetangganya, dan hak untuk menulis kembali.

Output:

#1: 17.99
#2: 4.50
#3: 38.25
#4: 7.43
item 1 vs item 0: down
item 2 vs item 1: up
item 3 vs item 2: down

Loop terakhir dimulai dari 1 karena membandingkan setiap elemen dengan elemen sebelumnya. Halaman array membahas cara membuat, mengurutkan, dan menyalin array itu sendiri.

Beberapa variabel loop

Initializer bisa mendeklarasikan beberapa variabel bertipe sama, dan iterator bisa memperbarui beberapa variabel, dipisahkan dengan koma. Penggunaan klasiknya adalah dua index yang berjalan saling mendekat:

Output:

racecar is a palindrome: True
9, 1, 8, 3

Kedua variabel harus bertipe sama dalam satu deklarasi: int left = 0, right = 10 bisa dipakai, int i = 0, string s = "" tidak bisa.

Nested loop

Loop di dalam loop menjalankan seluruh rentangnya sekali untuk setiap iterasi loop luar. Tabel dan grid adalah kasus yang khas:

Output:

   1   2   3   4
   2   4   6   8
   3   6   9  12
   4   8  12  16

Body bagian dalam dijalankan 16 kali (4 × 4). Loop bersarang melipatgandakan pekerjaan dengan cepat: dua loop bersarang yang masing-masing berisi 10.000 item berarti 100 juta iterasi. break di loop dalam hanya keluar dari loop dalam; halaman break dan continue menunjukkan cara keluar dari keduanya.

Infinite loop: for(;;)

Ketiga bagian header bersifat opsional. Tanpa kondisi, loop berjalan sampai ada sesuatu di dalamnya yang keluar:

Output:

Month 1: 70 left
Month 2: 40 left
Month 3: 10 left
Overdrawn in month 4: -20

for (;;) dan while (true) di-compile menjadi hal yang sama; pilih yang dipakai di codebase-mu.

Error off-by-one

Bug for yang paling umum adalah kondisi yang melangkah satu kali terlalu jauh:

Output:

Ada
Grace
Linus
IndexOutOfRangeException at index 3

Array berisi 3 elemen punya index 0, 1, dan 2, jadi i < names.Length adalah kondisi yang benar. Bug kebalikannya adalah menghitung mundur dengan i > 0, yang tidak pernah mengunjungi index 0. Pada List<T>, kesalahan yang sama melempar ArgumentOutOfRangeException sebagai gantinya.

Menghapus item saat perulangan

Menghapus dari List<T> di dalam loop yang berjalan maju menggeser setiap elemen sesudahnya satu posisi ke bawah, jadi loop melewatkan elemen tepat setelah setiap penghapusan:

Output:

forward:  5, 0, 3, 7
backward: 5, 3, 7

Loop yang berjalan maju menyisakan sebuah 0: setelah index 1 dihapus, nol kedua pindah ke index 1, tetapi i++ sudah bergerak ke index 2. Perulangan mundur menghindarinya karena penghapusan hanya menggeser elemen yang sudah kamu kunjungi. Sebagai alternatif satu baris, stock.RemoveAll(x => x == 0) melakukan hal yang sama. foreach loop sama sekali tidak mengizinkan penghapusan; ia melempar InvalidOperationException.

Counter floating-point

Hindari counter loop bertipe double yang diuji dengan kesamaan. 0.1 tidak punya representasi biner yang tepat, jadi menambahkannya sepuluh kali tidak menghasilkan tepat 1.0:

for (double x = 0; x != 1.0; x += 0.1)   // never ends: x skips past 1.0
{
}

Hitung dengan integer lalu hitung nilainya dari integer itu: for (int i = 0; i <= 10; i++) { double x = i / 10.0; }.

for versus foreach

KebutuhanPakai
Membaca setiap elemen secara berurutanforeach
Index, atau elemen tetangga (i - 1, i + 1)for
Meng-assign ke elemen arrayfor
Melompat 2 langkah, berjalan mundurfor
Menghapus dari List saat perulanganfor, mundur
Koleksi tanpa indexer (HashSet, Dictionary, hasil LINQ)foreach
Mengulang sesuatu N kali, tanpa koleksifor

Pada array, kedua loop di-compile menjadi kode yang pada dasarnya sama, jadi pilih berdasarkan keterbacaan, bukan kecepatan.

Pertanyaan yang sering diajukan

Bagaimana sintaks for loop di C#?

for (initializer; condition; iterator) { body }, misalnya for (int i = 0; i < 5; i++) { ... }. Initializer dijalankan sekali, kondisi dicek sebelum setiap iterasi, dan iterator dijalankan setelah setiap iterasi. Loop berakhir begitu kondisinya bernilai false untuk pertama kali.

Bagaimana cara melakukan perulangan mundur di C#?

Mulai dari index terakhir lalu kurangi: for (int i = items.Length - 1; i >= 0; i--). Perhatikan >= 0, bukan > 0, atau elemen pertama akan terlewat. Perulangan mundur juga merupakan cara aman untuk menghapus item dari List saat iterasi.

Kapan sebaiknya memakai for alih-alih foreach di C#?

Pakai for saat kamu butuh index-nya (untuk membandingkan elemen tetangga, menulis kembali ke array, atau melompat lebih dari satu), saat kamu menghitung alih-alih menelusuri koleksi, atau saat kamu menghapus item dari list. Pakai foreach untuk membaca setiap elemen secara berurutan; bentuknya lebih singkat dan tidak punya index yang bisa salah.

Bagaimana cara menulis infinite loop di C#?

for (;;) { ... } atau while (true) { ... }. Ketiga bagian header for bersifat opsional, dan kondisi yang tidak ditulis dianggap true. Keluar dari loop dengan break atau return saat kondisi keluarmu terpenuhi.

Kenapa saya mendapat IndexOutOfRangeException di for loop?

Kondisinya membiarkan index mencapai panjang array: i <= array.Length mengunjungi array[array.Length], satu langkah melewati elemen terakhir. Index yang valid berjalan dari 0 sampai Length - 1, jadi kondisinya seharusnya i < array.Length (atau i < list.Count untuk List, yang melempar ArgumentOutOfRangeException sebagai gantinya).

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai