Saya punya beberapa Daftar:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
Saya ingin menerapkan beberapa transformasi ke elemen daftar saya. Saya dapat melakukan ini dengan dua cara:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
Apa perbedaan antara kedua cara ini?
Jawaban:
Select
adalah metode ekstensi LINQ dan bekerja pada semuaIEnumerable<T>
objek sedangkanConvertAll
diimplementasikan hanya olehList<T>
. TheConvertAll
Metode ada sejak NET 2.0 sedangkan LINQ diperkenalkan dengan 3,5.Anda harus memilih
Select
alihConvertAll
karena berfungsi untuk semua jenis daftar, tetapi pada dasarnya mereka melakukan hal yang sama.sumber
Select
danConvertAll
. Yang pertama memilih setiap item secara berurutan dan Anda bebas melakukan apa pun yang Anda inginkan. Yang terakhir memiliki maksud yang jelas: ubah item ini menjadi sesuatu yang lain.ConvertAll
bukan sebuah ekstensi, ini adalah metode dalam kelas daftar. Anda tidak perlu memanggilToList
hasilnya karena sudah ada daftar:Jadi, perbedaannya adalah bahwa
ConvertAll
metode ini hanya dapat digunakan pada daftar, dan mengembalikan daftar. TheSelect
Metode dapat digunakan pada setiap koleksi yang mengimplementasikan dalamIEnumerable<T>
antarmuka, dan mengembalikan sebuahIEnumerable<T>
.Selain itu, mereka melakukan pemrosesan secara berbeda, sehingga mereka memiliki kekuatan dalam situasi yang berbeda. The
ConvertAll
Metode berjalan melalui daftar dan membuat daftar baru dalam satu pergi, sedangkanSelect
metode menggunakan eksekusi malas dan hanya memproses item yang Anda butuhkan mereka. Jika Anda tidak membutuhkan semua item,Select
metode ini lebih efisien. Di sisi lain, setelahConvertAll
mengembalikan daftar, Anda tidak perlu menyimpan daftar asli.sumber
Select
.Jawaban pertama bukanlah jawaban yang diterima. Saya mantan 2007 C # Microsoft MVP.
Berbeda dengan respons yang diterima,
ConvertAll
jauh lebih efisien daripada kombinasiSelect
danToList()
.Pertama-tama,
ConvertAll
ini benar-benar lebih cepat dan menggunakan jumlah memori minimum untuk melakukannya. Sama seperti Array.ConvertAll vs Select dan ToArray. Ini akan jauh lebih jelas dengan larik panjang yang lebih besar atau banyak panggilan dalam satu loop.1)
ConvertAll
mengetahui ukuran daftar akhir dan menghindari mengalokasikan kembali array dasar.ToList
() akan terus mengubah ukuran larik beberapa kali.2)
ToList
akan membuatIEnumerable<>
panggilan antarmuka lebih lambat , sementaraConvertAll
akan mengulang melalui array yang mendasarinya tanpa panggilan tambahan atau pemeriksaan jangkauan.3) Pilih akan membuat
IEnumerable<T>
objek ekstra .sumber
Saya tahu ini agak terlambat tetapi saya masih menambahkan karena ini bisa berguna bagi orang lain di masa depan.
Saat menggunakannya dalam ekspresi kueri EntityFramework, tidak disarankan untuk menggunakan ConvertAll () karena ini mengevaluasi ekspresi daripada membiarkannya sebagai ekspresi untuk digunakan di masa mendatang. Ini sangat menurunkan kinerja eksekusi kueri database karena harus membuat sejumlah panggilan sebelum mengevaluasi ekspresi akhir.
sumber
ConvertAll
adalah metode aktifList<T>
. Pada saat Anda memiliki daftarnya, Anda telah mengevaluasi ekspresi Anda. Tetapi Anda benar - jika Anda tidak ingin mengevaluasi semua,Select
lebih baik.