Saya punya kamus umum Dictionary<string, T>
yang ingin saya buat pada dasarnya Clone () dari saran .any.
c#
generics
collections
clone
mikeymo
sumber
sumber
entry.Value
nilai mungkin lagi [sub] koleksi.Clone()
metode apakah itu dalam atau dangkal. Saya telah menambahkan catatan untuk efek itu.ConcurrentDictionary
.(Catatan: meskipun versi kloning berpotensi berguna, untuk menyalin dangkal konstruktor yang saya sebutkan di posting lain adalah pilihan yang lebih baik.)
Seberapa dalam Anda menginginkan salinannya, dan versi .NET apa yang Anda gunakan? Saya menduga bahwa panggilan LINQ ke ToDictionary, menentukan kunci dan elemen pemilih, akan menjadi cara termudah untuk pergi jika Anda menggunakan .NET 3.5.
Misalnya, jika Anda tidak keberatan nilainya menjadi klon dangkal:
Jika Anda sudah membatasi T untuk mengimplementasikan ICloneable:
(Itu belum diuji, tetapi harus bekerja.)
sumber
sumber
Untuk .NET 2.0 Anda bisa mengimplementasikan kelas yang mewarisi dari
Dictionary
dan mengimplementasikanICloneable
.Anda kemudian dapat mengkloning kamus hanya dengan memanggil
Clone
metode. Tentu saja implementasi ini mensyaratkan bahwa jenis nilai dari kamus mengimplementasikanICloneable
, tetapi jika tidak, implementasi generik sama sekali tidak praktis.sumber
Ini berfungsi baik untuk saya
Seperti yang dijelaskan Tomer Wolberg dalam komentar, ini tidak berfungsi jika tipe nilai adalah kelas yang bisa berubah.
sumber
Anda selalu dapat menggunakan serialisasi. Anda bisa membuat cerita bersambung objek lalu deserialisasi. Itu akan memberi Anda salinan yang mendalam dari Kamus dan semua item di dalamnya. Sekarang Anda dapat membuat salinan dalam dari objek apa pun yang ditandai sebagai [Serializable] tanpa menulis kode khusus apa pun.
Berikut adalah dua metode yang akan menggunakan Serialisasi Binary. Jika Anda menggunakan metode ini, Anda cukup menelepon
sumber
Cara terbaik bagi saya adalah ini:
sumber
Metode Serialisasi Binary berfungsi dengan baik tetapi dalam tes saya itu menunjukkan 10x lebih lambat daripada implementasi non-serialisasi klon. Mengujinya
Dictionary<string , List<double>>
sumber
ToBinary()
dalamSerialize()
metode ini disebut denganthis
bukanyourDictionary
. Kemudian dalamFromBinary()
byte [] disalin pertama kali secara manual ke MemStream tetapi hanya dapat diberikan ke konstruktornya.Itulah yang membantu saya, ketika saya mencoba menyalin Kamus <string, string>
Semoga berhasil
sumber
Coba ini jika kunci / nilai ICloneable:
sumber
Membalas posting lama namun saya merasa berguna untuk membungkusnya sebagai berikut:
sumber