Ini bukan while
vs foreach
yang membuat perbedaan. Ini adalah panggilan ke .Cast<T>()
.
Dalam sampel pertama, Anda menghasilkan sama objek dalam setiap iterasi dari loop while. Jika Anda tidak hati-hati, Anda akhirnya menyelesaikan iterator hasil sebelum benar-benar menggunakan data, dan DataReader sudah akan dibuang. Ini dapat terjadi jika Anda, misalnya, memanggil .ToList()
setelah memanggil metode ini. Hal terbaik yang dapat Anda harapkan adalah agar setiap rekaman dalam daftar memiliki nilai yang sama.
(Tips profesional:sebagian besar waktu Anda tidak ingin memanggil .ToList()
sampai Anda benar-benar harus melakukannya. Lebih baik bekerja dengan catatan IEnumerable).
Dalam contoh kedua, saat Anda memanggil .Cast<T>()
pada datareader, Anda secara efektif membuat salinan data saat iterasi melalui setiap catatan. Sekarang Anda tidak lagi menghasilkan objek yang sama.