Ich habe ein allgemeines Wörterbuch Dictionary<string, T>
, mit dem ich im Wesentlichen einen Klon () aus allen Vorschlägen erstellen möchte.
c#
generics
collections
clone
mikeymo
quelle
quelle
entry.Value
Wert könnte eine weitere [Unter-] Sammlung sein.Clone()
Methode, ob er tief oder flach ist. Ich habe eine Notiz zu diesem Effekt hinzugefügt.ConcurrentDictionary
.(Hinweis: Obwohl die Klonversion möglicherweise nützlich ist, ist für eine einfache flache Kopie der Konstruktor, den ich im anderen Beitrag erwähne, eine bessere Option.)
Wie tief soll die Kopie sein und welche Version von .NET verwenden Sie? Ich vermute, dass ein LINQ-Aufruf von ToDictionary, bei dem sowohl die Schlüssel- als auch die Elementauswahl angegeben werden, der einfachste Weg ist, wenn Sie .NET 3.5 verwenden.
Wenn es Ihnen beispielsweise nichts ausmacht, dass der Wert ein flacher Klon ist:
Wenn Sie T bereits auf die Implementierung von ICloneable beschränkt haben:
(Diese sind ungetestet, sollten aber funktionieren.)
quelle
quelle
Für .NET 2.0 können Sie eine Klasse implementieren, die von
Dictionary
und implementiertICloneable
.Sie können das Wörterbuch dann einfach durch Aufrufen der
Clone
Methode klonen . Natürlich erfordert diese Implementierung, dass der Werttyp des Wörterbuchs implementiert wirdICloneable
, aber ansonsten ist eine generische Implementierung überhaupt nicht praktikabel.quelle
Das funktioniert gut für mich
Wie Tomer Wolberg in den Kommentaren beschreibt, funktioniert dies nicht, wenn der Werttyp eine veränderbare Klasse ist.
quelle
Sie können jederzeit die Serialisierung verwenden. Sie können das Objekt serialisieren und dann deserialisieren. Dadurch erhalten Sie eine ausführliche Kopie des Wörterbuchs und aller darin enthaltenen Elemente. Jetzt können Sie eine tiefe Kopie jedes Objekts erstellen, das als [serialisierbar] markiert ist, ohne einen speziellen Code zu schreiben.
Hier sind zwei Methoden, die die binäre Serialisierung verwenden. Wenn Sie diese Methoden verwenden, rufen Sie einfach auf
quelle
Der beste Weg für mich ist folgender:
quelle
Die binäre Serialisierungsmethode funktioniert einwandfrei, aber in meinen Tests hat sie sich als 10-mal langsamer erwiesen als eine Nicht-Serialisierungsimplementierung des Klons. Getestet am
Dictionary<string , List<double>>
quelle
ToBinary()
derSerialize()
Methode wird mitthis
statt aufgerufenyourDictionary
. Dann wirdFromBinary()
das Byte [] zuerst manuell in den MemStream kopiert, kann aber einfach an seinen Konstruktor übergeben werden.Das hat mir geholfen, als ich versucht habe, ein Wörterbuch <string, string> tief zu kopieren
Viel Glück
quelle
Versuchen Sie dies, wenn Schlüssel / Werte ICloneable sind:
quelle
Als ich auf einen alten Beitrag antwortete, fand ich es nützlich, ihn wie folgt zu verpacken:
quelle