Lebih
Bagaimana cara clone daftar generik di C#?
Saya memiliki daftar generik objek di C#, dan berharap untuk mengkloning daftar. Item dalam daftar yang cloneable, tapi ada doesn't tampaknya menjadi pilihan untuk melakukan daftar.Clone()
.
Apakah ada cara mudah ini?
541
26
Jika unsur-unsur nilai jenis, maka anda hanya dapat melakukan:
Namun, jika mereka adalah jenis referensi dan anda ingin dalam salinan (dengan asumsi anda benar menerapkan unsur-unsur
ICloneable
), anda bisa melakukan sesuatu seperti ini:Jelas, ganti
ICloneable
di atas obat generik dan cor dengan apa elemen anda adalah tipe yang menerapkanICloneable
.Jika anda jenis elemen doesn't dukungan
ICloneable
tetapi tidak memiliki copy constructor, anda bisa melakukan hal ini sebagai gantinya:Secara pribadi, saya akan menghindari
ICloneable
karena kebutuhan untuk menjamin dalam salinan dari semua anggota. Sebaliknya, saya'd sarankan copy-konstruktor atau metode pabrik sepertiYourType.CopyFrom(YourType itemToCopy)
yang mengembalikan sebuah instance baru dariYourType
.Setiap pilihan ini bisa dibungkus dengan metode (ekstensi atau sebaliknya).
Anda dapat menggunakan metode penyuluhan.
Untuk salinan dangkal, anda dapat menggunakan GetRange metode generik Daftar kelas.
Dikutip dari: Resep obat Generik
Ini adalah salah satu cara untuk melakukannya dengan C# dan .NET 2.0. Objek anda membutuhkan untuk menjadi
[Serializable()]
. Tujuannya adalah untuk menurunkan semua referensi dan membangun yang baru.Setelah sedikit modifikasi, anda juga bisa clone:
Untuk mengkloning daftar panggil .Kedaftar()
Kecuali anda butuhkan sebenarnya clone dari setiap objek di dalam
Daftar<T>
, cara terbaik untuk mengkloning daftar untuk membuat daftar baru dengan yang lama daftar sebagai koleksi parameter.Perubahan
myList
seperti menyisipkan atau menghapus tidak akan mempengaruhicloneOfMyList
dan sebaliknya.Benda-benda yang sebenarnya dua Daftar yang berisi yang masih sama namun.
Jika anda hanya peduli tentang nilai jenis...
Dan anda tahu jenis:
Jika anda don't tahu jenis sebelumnya, anda'll membutuhkan fungsi pembantu:
Hanya:
Gunakan AutoMapper (atau apapun pemetaan lib anda sukai) untuk mengkloning sederhana dan banyak dipelihara.
Menentukan pemetaan:
Melakukan sihir:
Jika anda sudah dirujuk Newtonsoft.Json dalam proyek anda dan benda-benda yang serializeable anda selalu bisa menggunakan:
Mungkin bukan cara yang paling efisien untuk melakukannya, tetapi jika anda're melakukannya 100 1000s kali anda mungkin bahkan tidak menyadari perbedaan kecepatan.
I'akan beruntung jika ada yang pernah membaca ini... tapi dalam rangka untuk tidak kembali daftar tipe objek di Clone metode, aku menciptakan sebuah antarmuka:
Kemudian saya ditentukan ekstensi:
Dan berikut ini adalah implementasi antarmuka pada saya A/V menandai perangkat lunak. Saya ingin memiliki saya Clone() metode kembali daftar VidMark (sementara ICloneable antarmuka yang ingin saya metode untuk mengembalikan daftar objek):
Dan akhirnya, penggunaan ekstensi di dalam kelas:
Orang seperti itu? Perbaikan?
Anda bisa juga hanya mengkonversi daftar ke array menggunakan
ToArray
, dan kemudian clone array menggunakanArray.Clone(...)
. Tergantung pada kebutuhan anda, metode yang termasuk dalam kelas Array bisa memenuhi kebutuhan anda.Anda dapat menggunakan metode penyuluhan:
Anda dapat mengkloning semua benda dengan menggunakan nilai mereka jenis anggota misalnya, menganggap kelas ini:
Jika anda membutuhkan kloning daftar dengan kapasitas yang sama, anda dapat mencoba ini:
Teman saya Gregor Martinovic dan saya datang dengan ini solusi mudah menggunakan JavaScript Serializer. Ada tidak perlu untuk menandai kelas sebagai Serializable dan dalam pengujian kami menggunakan Newtonsoft JsonSerializer bahkan lebih cepat daripada menggunakan BinaryFormatter. Dengan metode ekstensi yang dapat digunakan pada setiap objek.
Standar .NET JavascriptSerializer pilihan:
Lebih cepat menggunakan opsi Newtonsoft JSON:
Saya menggunakan automapper untuk menyalin suatu objek. Saya hanya men-setup sebuah pemetaan yang memetakan satu objek untuk dirinya sendiri. Anda dapat membungkus operasi ini cara apapun yang anda suka.
http://automapper.codeplex.com/