Mám všeobecný zoznam objektov v jazyku C# a chcem ho klonovať. Položky v zozname sa dajú klonovať, ale zdá sa, že neexistuje možnosť vykonať list.Clone()
.
Existuje nejaký jednoduchý spôsob, ako to obísť?
Ak sú vaše prvky hodnotové typy, môžete jednoducho urobiť:
List<YourType> newList = new List<YourType>(oldList);
Ak sú to však referenčné typy a vy chcete hĺbkovú kópiu (za predpokladu, že vaše prvky správne implementujú ICloneable
), môžete urobiť niečo takéto:
List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);
oldList.ForEach((item) =>
{
newList.Add((ICloneable)item.Clone());
});
Samozrejme, vo vyššie uvedených generikách nahraďte ICloneable
a použite akýkoľvek typ vášho prvku, ktorý implementuje ICloneable
.
Ak váš typ prvku nepodporuje ICloneable
, ale má kopírovací konštruktor, môžete namiesto toho urobiť toto:
List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);
oldList.ForEach((item)=>
{
newList.Add(new YourType(item));
});
Osobne by som sa vyhol ICloneable
kvôli potrebe zaručiť hlboké kopírovanie všetkých členov. Namiesto toho by som navrhoval kopírovací konštruktor alebo továrenskú metódu ako YourType.CopyFrom(YourType itemToCopy)
, ktorá vráti novú inštanciu YourType
.
Ktorákoľvek z týchto možností by mohla byť obalená metódou (rozšírením alebo inak).
Pre plytké kopírovanie môžete namiesto toho použiť metódu GetRange generickej triedy List.
List<int> oldList = new List<int>( );
// Populate oldList...
List<int> newList = oldList.GetRange(0, oldList.Count);
Citované z: Generics Recipes
Ak vás zaujímajú len hodnotové typy...
A poznáte typ:
List<int> newList = new List<int>(oldList);
Ak typ nepoznáte, budete potrebovať pomocnú funkciu:
List<T> Clone<T>(IEnumerable<T> oldList)
{
return newList = new List<T>(oldList);
}
Práve:
List<string> myNewList = Clone(myOldList);