Como faço para clonar uma lista genérica em C#?

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

Comentários (21)

Para uma cópia rasa, você pode usar o método GetRange da classe da lista genérica.

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

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

Citado de: Receitas Genéricas

Comentários (2)

Se você só se preocupa com os tipos de valores...

E tu conheces o tipo:

List newList = new List(oldList);

Se você não'não sabe o tipo antes, você'vai precisar de uma função de ajuda:

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

O justo:

List myNewList = Clone(myOldList);
Comentários (2)