Ho un elenco generico di oggetti in C#, e vorrei clonare l'elenco. Gli elementi all'interno della lista sono clonabili, ma non sembra esserci un'opzione per fare list.Clone()
.
C'è un modo semplice per aggirare questo problema?
Se i vostri elementi sono tipi di valore, allora potete semplicemente fare:
List<YourType> newList = new List<YourType>(oldList);
Tuttavia, se sono tipi di riferimento e vuoi una copia profonda (assumendo che i tuoi elementi implementino correttamente ICloneable
), potresti fare qualcosa del genere:
List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);
oldList.ForEach((item) =>
{
newList.Add((ICloneable)item.Clone());
});
Ovviamente, sostituite ICloneable
nei generici di cui sopra e fate il cast con qualunque sia il vostro tipo di elemento che implementa ICloneable
.
Se il tuo tipo di elemento non supporta ICloneable
ma ha un costruttore di copie, potresti fare così:
List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);
oldList.ForEach((item)=>
{
newList.Add(new YourType(item));
});
Personalmente, eviterei ICloneable
a causa della necessità di garantire una copia profonda di tutti i membri. Invece, suggerirei il costruttore di copie o un metodo di fabbrica come YourType.CopyFrom(YourType itemToCopy)
che restituisce una nuova istanza di YourType
.
Ognuna di queste opzioni potrebbe essere avvolta da un metodo (estensione o altro).
Per una copia superficiale, potete invece usare il metodo GetRange della classe List generica.
List<int> oldList = new List<int>( );
// Populate oldList...
List<int> newList = oldList.GetRange(0, oldList.Count);
Citato da: Ricette generiche
Se ti interessano solo i tipi di valore...
E conosci il tipo:
List<int> newList = new List<int>(oldList);
Se non conosci il tipo prima, avrai bisogno di una funzione di aiuto:
List<T> Clone<T>(IEnumerable<T> oldList)
{
return newList = new List<T>(oldList);
}
Il solo:
List<string> myNewList = Clone(myOldList);