Περισσότερα
Πώς μπορώ να κλωνοποιήσω μια γενική λίστα στη C#;
Έχω μια γενική λίστα αντικειμένων σε C# και επιθυμώ να κλωνοποιήσω τη λίστα. Τα αντικείμενα εντός της λίστας μπορούν να κλωνοποιηθούν, αλλά δεν φαίνεται να υπάρχει επιλογή για να κάνω list.Clone()
.
Υπάρχει κάποιος εύκολος τρόπος για να το παρακάμψετε αυτό;
541
3
Αν τα στοιχεία σας είναι τύποι τιμών, τότε μπορείτε απλά να κάνετε:
Ωστόσο, αν είναι τύποι αναφοράς και θέλετε ένα βαθύ αντίγραφο (υποθέτοντας ότι τα στοιχεία σας υλοποιούν σωστά το
ICloneable
), θα μπορούσατε να κάνετε κάτι τέτοιο:Προφανώς, αντικαταστήστε το
ICloneable
στα παραπάνω generics και κάντε cast με οποιονδήποτε τύπο στοιχείου σας που υλοποιεί τοICloneable
.Αν ο τύπος του στοιχείου σας δεν υποστηρίζει το
ICloneable
αλλά έχει έναν κατασκευαστή αντιγραφής, μπορείτε να κάνετε αυτό αντί αυτού:Προσωπικά, θα απέφευγα το
ICloneable
λόγω της ανάγκης να εγγυηθείτε ένα βαθύ αντίγραφο όλων των μελών. Αντ' αυτού, θα πρότεινα τον copy-constructor ή μια εργοστασιακή μέθοδο όπωςYourType.CopyFrom(YourType itemToCopy)
που επιστρέφει μια νέα περίπτωση τουYourType
.Οποιαδήποτε από αυτές τις επιλογές θα μπορούσε να περιτυλιχθεί από μια μέθοδο (επέκταση ή όχι).
Για ένα ρηχό αντίγραφο, μπορείτε να χρησιμοποιήσετε τη μέθοδο GetRange της γενικής κλάσης List.
Παρατίθεται από: [Generics Recipes][1]
[1]: https://web.archive.org/web/20121230023705/http://en.csharp-online.net/CSharp_Generics_Recipes%E2%80%94Replacing_the_ArrayList_with_Its_Generic_Counterpart "C# Generics Recipes",
Αν σας ενδιαφέρουν μόνο οι τύποι τιμών...
Και γνωρίζετε τον τύπο:
Αν δεν γνωρίζετε τον τύπο από πριν, θα χρειαστείτε μια βοηθητική συνάρτηση:
Η just: