Ako klonovať všeobecný zoznam v jazyku C#?

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 newList = new List(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 oldList = new List();
List newList = new List(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 oldList = new List();
List newList = new List(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).

Komentáre (21)

Pre plytké kopírovanie môžete namiesto toho použiť metódu GetRange generickej triedy List.

List oldList = new List( );
// Populate oldList...

List newList = oldList.GetRange(0, oldList.Count);

Citované z: Generics Recipes

Komentáre (2)

Ak vás zaujímajú len hodnotové typy...

A poznáte typ:

List newList = new List(oldList);

Ak typ nepoznáte, budete potrebovať pomocnú funkciu:

List Clone(IEnumerable oldList)
{
    return newList = new List(oldList);
}

Práve:

List myNewList = Clone(myOldList);
Komentáre (2)