Catatan: jawaban ini lebih berlaku untuk Java daripada C #, karena C # tidak memiliki pengindeks LinkedLists, tapi saya pikir poin umum masih berlaku.
Jika yang listAnda kerjakan kebetulan adalah a LinkedList, kinerja kode pengindeks ( pengaksesan gaya larik ) jauh lebih buruk daripada menggunakan IEnumeratordari foreach, untuk daftar besar.
Saat Anda mengakses elemen 10.000 dalam LinkedListmenggunakan sintaks pengindeks :, list[10000]daftar tertaut akan dimulai pada simpul kepala, dan melintasi Next-pointer sepuluh ribu kali, hingga mencapai objek yang benar. Jelas, jika Anda melakukan ini dalam satu lingkaran, Anda akan mendapatkan:
list[0]; // head
list[1]; // head.Next
list[2]; // head.Next.Next
// etc.
Saat Anda memanggil GetEnumerator(secara implisit menggunakan forach-syntax), Anda akan mendapatkan IEnumeratorobjek yang memiliki penunjuk ke node kepala. Setiap kali Anda memanggil MoveNext, penunjuk tersebut dipindahkan ke node berikutnya, seperti:
IEnumerator em = list.GetEnumerator(); // Current points at head
em.MoveNext(); // Update Current to .Next
em.MoveNext(); // Update Current to .Next
em.MoveNext(); // Update Current to .Next
// etc.
Seperti yang Anda lihat, dalam kasus LinkedLists, metode pengindeks array menjadi lebih lambat dan lebih lambat, semakin lama Anda melakukan perulangan (harus melalui penunjuk kepala yang sama berulang kali). Padahal yang IEnumerableadil beroperasi dalam waktu yang konstan.
Tentu saja, seperti yang dikatakan Jon ini sangat tergantung pada jenisnya list, jika listbukan a LinkedList, tapi sebuah array, perilakunya sangat berbeda.