2016-04-29 7 views
2

In C#, wenn ich eine IList habe, und ich kenne nicht den Typ der Objekte in der IList, wie kann ich eine Kopie der IList erstellen? HierWie kann ich eine IList in eine IList des gleichen Typs kopieren?

ist die Situation:

Ich habe eine Collection, die Elemente in einer IList ändern können. Wenn die Abbrechen-Taste gedrückt wird, muss ich die IList wiederherstellen, bevor die Elemente geändert wurden.

+3

, was Sie versucht hatte? –

+0

Hinweis: Sehen Sie in der Dokumentation zu IList nach: https://msdn.microsoft.com/en-us/library/5y536ey6%28v=vs.110%29.aspx. – devuxer

+0

Sie müssen die Liste serialisieren und dann bei Bedarf deserialisieren. – bobah75

Antwort

4

Hier gibt es zwei verschiedene Probleme. Das Kopieren einer Liste in eine andere Liste ist relativ einfach - wenn Sie nicht brauchen, dass die zweite Liste genau die gleiche Art von konkreter Liste ist, könnten Sie ToList() verwenden, sonst könnten Sie einfach Add in einer Schleife. Allerdings wird Ihr Problem nicht lösen, wenn die T hier etwas unveränderlich ist. Es wäre in Ordnung für string, int usw., aber das Kopieren der Verweise auf einen komplexen Typ ermöglicht Ihnen nicht, die Liste wiederherzustellen, da einzelne Elemente in der Benutzeroberfläche bearbeitet werden konnten. Um das Problem zu lösen, benötigen Sie eine "tiefe Kopie" (oder es gibt einige andere Strategien, aber das ist das einfachste). Und wie bereits erwähnt: Eine Möglichkeit, eine tiefe Kopie zu erstellen, ist: Serialisierung. Indem ein Snapshot der Daten in XML, JSON oder einem anderen Serialisierungsformat erstellt wird, kann "Wiederherstellung" über "Deserialisierung" implementiert werden.

Natürlich, wenn Ihre T eine Deep-Clone-Methode eingebaut hat, können Sie diese anstelle der Serialisierung verwenden. Es ist mehrdeutig, ob ICloneable tief gegen flach ist, also glaube ich nicht, dass es ausreicht, darauf zu bestehen where T : ICloneable.

0

ToList erstellt eine Kopie:

IList x = y.ToList(); 
+0

wird nicht kopiert. Referenzen von Elementen wären gleich. Sie erhalten nur eine neue Liste, aber die gleichen Elemente. –

+2

Das erstellt eine flache Kopie, die in diesem Fall möglicherweise nicht ausreicht. –

+0

Gut zu wissen. Ich habe vielleicht einen Code zum ändern! –