Mam ogólny słownik Dictionary<string, T>
, który chciałbym zasadniczo zrobić Clone () z ... dowolnych sugestii.
c#
generics
collections
clone
mikeymo
źródło
źródło
entry.Value
Wartość może być jeszcze inny [sub] kolekcja.Clone()
metody, czy jest głęboka czy płytka. Dodałem notatkę do tego efektu.ConcurrentDictionary
.(Uwaga: chociaż wersja klonowania jest potencjalnie przydatna, dla zwykłego płytkiego kopiowania konstruktor, o którym wspomniałem w innym poście, jest lepszym rozwiązaniem).
Jak głęboko chcesz mieć kopię i jakiej wersji .NET używasz? Podejrzewam, że wywołanie LINQ do ToDictionary, określające zarówno klucz, jak i selektor elementów, będzie najłatwiejszym sposobem, jeśli używasz .NET 3.5.
Na przykład, jeśli nie przeszkadza ci, że wartość jest płytkim klonem:
Jeśli już ograniczyłeś T do implementacji ICloneable:
(Te są nieprzetestowane, ale powinny działać.)
źródło
źródło
W przypadku .NET 2.0 można zaimplementować klasę, która dziedziczy
Dictionary
i implementujeICloneable
.Następnie można sklonować słownik, po prostu wywołując
Clone
metodę. Oczywiście ta implementacja wymaga implementacji typu wartości słownikaICloneable
, ale w przeciwnym razie ogólna implementacja nie jest w ogóle praktyczna.źródło
To działa dobrze dla mnie
Jak Tomer Wolberg opisuje w komentarzach, nie działa to, jeśli typem wartości jest zmienna klasa.
źródło
Zawsze możesz użyć serializacji. Możesz serializować obiekt, a następnie deserializować go. To da ci głęboką kopię Słownika i wszystkich jego elementów. Teraz możesz utworzyć głęboką kopię dowolnego obiektu oznaczonego jako [Serializable] bez pisania specjalnego kodu.
Oto dwie metody, które wykorzystają Serializacja binarna. Jeśli używasz tych metod, po prostu dzwonisz
źródło
Najlepszy sposób dla mnie to:
źródło
Metoda szeregowania binarnego działa dobrze, ale w moich testach okazała się 10 razy wolniejsza niż implementacja klonowania bez serializacji. Testowałem to
Dictionary<string , List<double>>
źródło
ToBinary()
tejSerialize()
metodzie jest wywołanathis
zamiastyourDictionary
. Następnie wFromBinary()
bajcie [] jest najpierw kopiowany ręcznie do MemStream, ale można go po prostu dostarczyć do jego konstruktora.To mi pomogło, gdy próbowałem głęboko skopiować słownik <ciąg, ciąg>
Powodzenia
źródło
Spróbuj tego, jeśli klucz / wartości można ICloneable:
źródło
Odpowiadając na stary post, uznałem jednak, że warto go zawinąć w następujący sposób:
źródło