Tenho uma lista genérica de objectos em C#, e desejo clonar a lista. Os itens dentro da lista são clonáveis, mas parece haver't uma opção para fazer list.Clone()
.
Há alguma forma fácil de contornar isto?
Se os seus elementos são tipos de valor, então você pode simplesmente fazer:
List<YourType> newList = new List<YourType>(oldList);
No entanto, se forem tipos de referência e você quiser uma cópia profunda (assumindo que seus elementos implementem apropriadamente `ICloneable'), você poderia fazer algo como isto:
List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);
oldList.ForEach((item) =>
{
newList.Add((ICloneable)item.Clone());
});
Obviamente, substitua ICloneable
nos genéricos acima e funda com qualquer tipo de elemento que implemente o ICloneable
.
Se o seu tipo de elemento não'não suporta ICloneable
mas tem um copy-constructor, você poderia fazer isso em seu lugar:
List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);
oldList.ForEach((item)=>
{
newList.Add(new YourType(item));
});
Pessoalmente, eu evitaria o ICloneable
por causa da necessidade de garantir uma cópia profunda de todos os membros. Ao invés disso, I'd sugere o copy-constructor ou um método de fábrica como YourType.CopyFrom(YourType itemToCopy)
que retorna uma nova instância de YourType
.
Qualquer uma destas opções pode ser envolvida por um método (extensão ou não).
Para uma cópia rasa, você pode usar o método GetRange da classe da lista genérica.
List<int> oldList = new List<int>( );
// Populate oldList...
List<int> newList = oldList.GetRange(0, oldList.Count);
Citado de: Receitas Genéricas
Se você só se preocupa com os tipos de valores...
E tu conheces o tipo:
List<int> newList = new List<int>(oldList);
Se você não'não sabe o tipo antes, você'vai precisar de uma função de ajuda:
List<T> Clone<T>(IEnumerable<T> oldList)
{
return newList = new List<T>(oldList);
}
O justo:
List<string> myNewList = Clone(myOldList);