Catatan: jawaban ini lebih berlaku untuk Java daripada C #, karena C # tidak memiliki pengindeks LinkedLists
, tapi saya pikir poin umum masih berlaku.
Jika yang list
Anda kerjakan kebetulan adalah a LinkedList
, kinerja kode pengindeks ( pengaksesan gaya larik ) jauh lebih buruk daripada menggunakan IEnumerator
dari foreach
, untuk daftar besar.
Saat Anda mengakses elemen 10.000 dalam LinkedList
menggunakan 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 IEnumerator
objek 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 LinkedList
s, metode pengindeks array menjadi lebih lambat dan lebih lambat, semakin lama Anda melakukan perulangan (harus melalui penunjuk kepala yang sama berulang kali). Padahal yang IEnumerable
adil beroperasi dalam waktu yang konstan.
Tentu saja, seperti yang dikatakan Jon ini sangat tergantung pada jenisnya list
, jika list
bukan a LinkedList
, tapi sebuah array, perilakunya sangat berbeda.