Daftar NET. <T> Concat vs AddRange

Jawaban:

123

Mereka memiliki semantik yang sangat berbeda.

AddRange mengubah daftar dengan menambahkan item lain ke dalamnya.

Concat mengembalikan urutan baru yang berisi daftar dan item lainnya, tanpa mengubah daftar.

Pilih mana yang memiliki semantik yang Anda inginkan.

Greg Beech
sumber
1
Jadi ion loop ketat, akan jauh lebih baik untuk menggunakan menambahkan rentang agar tidak kehilangan kinerja karena semua pembaharuan internal dan hentakan GC?
johnc
45
Sebenarnya, karena eksekusi yang ditangguhkan, menggunakan Concat kemungkinan akan lebih cepat karena menghindari alokasi objek - Concat tidak menyalin apa pun, itu hanya membuat tautan di antara daftar sehingga ketika enumerasi dan Anda mencapai akhir, secara transparan akan membawa Anda ke awal selanjutnya!
Greg Beech
36

Perbedaan besar adalah bahwa AddRange mengubah daftar yang disebutnya sedangkan Concat membuat Daftar baru. Karenanya mereka memiliki kegunaan yang berbeda.

Juga Concat adalah metode ekstensi yang berlaku untuk IEnumerable dan mengembalikan IEnumerable, Anda memerlukan .ToList () untuk menghasilkan List baru.

Jika Anda ingin memperluas konten dari daftar yang sudah ada, gunakan AddRange.

Jika Anda membuat daftar baru dari dua sumber IEnumerable, gunakan Concat dengan .ToList. Ini memiliki kualitas yang tidak bermutasi pada salah satu sumber.

Jika Anda hanya perlu menghitung isi dari dua Daftar (atau IEnumerable lainnya) maka cukup gunakan Concat setiap kali, ini memiliki keuntungan karena tidak benar-benar mengalokasikan memori baru untuk menyimpan daftar terpadu.

AnthonyWJones
sumber
3
+1, Memang, jika Anda lupa untuk 'daftar', secara diam-diam tidak melakukan apa
smirkingman
7

Saya menemukan artikel menarik ini berbicara tentang perbedaan antara 2 struktur ini dan membandingkan kinerjanya ...

Ide utamanya adalah bahwa AddRange jauh lebih cepat jika tentang koleksi ukuran besar.

Ini Tautannya

Semoga ini membantu,

Haithem KAROUI
sumber
1
Saya telah melakukan tes membandingkan Concatdan AddRangedengan List<KeyValuePair<string, string>>1000 elemen, digabungkan / ditambahkan 100 kali, dan AddRangesangat cepat. Hasilnya adalah ini: AddRange13 ms, Concat().ToList()16.000 ms, dan Concatpada saat IEnumerablemelakukan hanya ToListpada akhirnya: 2.700 ms.
Andrew