Saya sering mengalami hal ini selama pemrograman di mana saya ingin memiliki loop count index di dalam foreach dan harus membuat integer, menggunakannya, increment, dll. Bukankah lebih baik jika ada kata kunci yang diperkenalkan yang jumlah loop di dalam foreach? Itu juga bisa digunakan dalam loop lain juga.
Apakah ini bertentangan dengan penggunaan kata kunci yang melihat bagaimana kompiler tidak akan mengizinkan kata kunci ini digunakan di mana pun kecuali dalam pembuatan loop?
for ()
loop.Jawaban:
Jika Anda membutuhkan jumlah loop di dalam
foreach
loop, mengapa Anda tidak menggunakanfor
loop biasa . Theforeach
Loop dimaksudkan untuk membuat penggunaan tertentu darifor
loop sederhana. Sepertinya Anda memiliki situasi di mana kesederhanaanforeach
tidak lagi bermanfaat.sumber
IEnumerable.Count
bisa jadi mahal (atau tidak mungkin, jika itu hanya penghitungan satu kali). Anda perlu tahu apa sumber yang mendasarinya sebelum Anda bisa melakukannya dengan aman.foreach
lebihfor (int i = 0…)
. Dia telah menulis beberapa halaman tetapi saya dapat meringkas dalam dua kata - optimasi kompiler pada iterasi. Oke, itu bukan dua kata.for
loop memberikan kode yang lebih mudah dibaca (dan optimisasi kompiler teoretis sering merupakan optimasi prematur).Anda dapat menggunakan jenis anonim seperti ini
Ini mirip dengan
enumerate
fungsi Pythonsumber
Saya hanya menambahkan jawaban Dan Finch di sini, seperti yang diminta.
Jangan beri aku poin, beri poin ke Dan Finch :-)
Solusinya adalah menulis metode ekstensi generik berikut:
Yang digunakan seperti ini:
sumber
Saya mungkin salah tentang hal ini, tetapi saya selalu berpikir bahwa titik utama dari foreach loop adalah untuk menyederhanakan iterasi dari hari STL dari C ++ yaitu
bandingkan ini dengan .NET penggunaan IEnumerable di muka
yang terakhir jauh lebih sederhana dan menghindari banyak perangkap lama. Selain itu, mereka tampaknya mengikuti aturan yang hampir identik. Misalnya Anda tidak dapat mengubah konten IEnumerable saat berada di dalam loop (yang jauh lebih masuk akal jika Anda menganggapnya sebagai cara STL). Namun, for loop seringkali memiliki tujuan logis yang berbeda dari iterasi.
sumber
for(IEnumerator e=collection.GetEnumerator;e.MoveNext();) { ... }
Jika koleksi yang dimaksud adalah
IList<T>
, Anda cukup menggunakanfor
dengan pengindeksan:Jika tidak, maka Anda bisa menggunakannya
Select()
, itu memiliki kelebihan yang memberi Anda indeks.Jika itu juga tidak cocok, saya pikir mempertahankan indeks secara manual cukup sederhana, itu hanya dua baris kode yang sangat pendek. Membuat kata kunci khusus untuk ini akan menjadi kerja keras.
sumber
foo(++i)
ataufoo(i++)
tergantung pada indeks mana yang diperlukan.Jika yang Anda tahu adalah bahwa koleksi tersebut adalah jumlah IEn, tetapi perlu melacak berapa banyak elemen yang telah Anda proses sejauh ini (dan dengan demikian total ketika Anda selesai), Anda dapat menambahkan beberapa baris ke dasar untuk loop:
Anda juga bisa menambahkan variabel indeks yang ditambahkan ke foreach:
Jika Anda ingin membuat ini terlihat lebih elegan, Anda dapat menentukan satu atau dua metode ekstensi untuk "menyembunyikan" detail ini:
sumber
Pelingkupan juga berfungsi jika Anda ingin menjaga blok bersih dari tabrakan dengan nama lain ...
sumber
Untuk ini saya menggunakan
while
loop. Loop denganfor
juga bekerja, dan banyak orang tampaknya lebih suka mereka, tetapi saya hanya suka menggunakanfor
dengan sesuatu yang akan memiliki jumlah iterasi yang tetap.IEnumerable
s dapat dihasilkan pada saat run time, jadi, menurut saya,while
lebih masuk akal. Sebut saja panduan pengodean informal, jika Anda mau.sumber