de-vraag
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
 Fiona
Fiona
Question

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ť?

541 2008-10-21T16:47:05+00:00 3
Peter Mortensen
Peter Mortensen
Edited question 3 december 2012 в 6:26
Programovanie
clone
c#
list
generics
This question has 1 odpoveď in English, to read them log in to your account.
Jeff Yates
Jeff Yates
21 október 2008 в 4:54
2008-10-21T16:54:15+00:00
Viac na
Zdroj
Upraviť
#8580781

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).

Jeff Yates
Jeff Yates
Edited answer 21 október 2008 в 5:06
483
0
Anthony Potts
Anthony Potts
21 október 2008 в 4:52
2008-10-21T16:52:10+00:00
Viac na
Zdroj
Upraviť
#8580780

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

Jochem Broekhoff
Jochem Broekhoff
Edited answer 7 apríl 2018 в 2:15
79
0
James Curran
James Curran
21 október 2008 в 4:54
2008-10-21T16:54:41+00:00
Viac na
Zdroj
Upraviť
#8580783

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);
Lucas B
Lucas B
Edited answer 15 apríl 2013 в 1:08
14
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Jasur Fozilov
Registered pred 9 hodinami
2
Zuxriddin Muydinov
Registered pred dňom
3
Денис Анненский
Registered pred 3 dňami
4
365
Registered pred týždňom
5
True Image
Registered pred týždňom
DA
DE
EL
ES
FR
ID
IT
JA
KO
NL
PT
RU
SK
SL
ZH
© de-vraag 2022
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora