Generische Methode zum Erstellen einer tiefen Kopie aller Elemente in einer Sammlung

8

Ich habe verschiedene ObservableCollections verschiedener Objekttypen. Ich würde gerne eine einzelne Methode schreiben, die eine Sammlung dieser Objekttypen erstellt und eine neue Sammlung zurückgibt, bei der jedes Element eine tiefe Kopie der Elemente in der angegebenen Sammlung ist. Hier ist ein Beispiel für eine bestimmte Klasse

%Vor%

Wie kann ich diese Methode für jede Klasse, die ICloneable implementiert, generisch machen?

    
bwarner 30.04.2010, 13:21
quelle

3 Antworten

25

Sie könnten so etwas tun:

%Vor%

Beachten Sie, dass Sie dies allgemeiner machen können, indem Sie IEnumerable<T> verwenden, und LINQ macht es noch einfacher:

%Vor%     
Jon Skeet 30.04.2010, 13:23
quelle
3
%Vor%     
Hinek 30.04.2010 13:26
quelle
0

Ich verwende eine sehr ähnliche Funktion, die mit allen ICollections funktioniert, die konstruiert werden können (z.B. viele Standardsammlungen):

%Vor%

Leider kann der Compiler die Typen nicht ableiten, so dass man sie explizit übergeben muss. Für mehr als eine Handvoll Anrufe schreibe ich eine Spezialisierung. Hier ist ein Beispiel für Listen (die selbst mit implizit abgeleitetem T aufgerufen werden können).

%Vor%

Ich nutze diese Funktion ausgiebig, um Kopien von Listen zu erstellen, die als Datenquellen für Datagridviews in Dialogen dienen, die abgebrochen werden können. Die geänderte Liste wird einfach verworfen, wenn der Dialog abgebrochen wird. Wenn der Dialog OK ist, ersetzt die bearbeitete Liste einfach das Original. Voraussetzung für dieses Muster ist natürlich eine semantisch korrekte und gut erhaltene T.clone() .

    
Peter A. Schneider 30.09.2014 09:52
quelle

Tags und Links