¿Cómo clono una lista genérica en C#?

Resuelto Fiona asked hace 16 años • 30 respuestas

Tengo una lista genérica de objetos en C# y deseo clonar la lista. Los elementos de la lista se pueden clonar, pero no parece haber una opción para hacerlo list.Clone().

¿Existe una manera fácil de solucionar esto?

Fiona avatar Oct 21 '08 23:10 Fiona
Aceptado

Si sus elementos son tipos de valor, entonces puede hacer:

List<YourType> newList = new List<YourType>(oldList);

Sin embargo, si son tipos de referencia y desea una copia profunda (suponiendo que sus elementos se implementen correctamente ICloneable), podría hacer algo como esto:

List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);

oldList.ForEach((item) =>
    {
        newList.Add((ICloneable)item.Clone());
    });

Obviamente, reemplace ICloneablelos genéricos anteriores y emita con cualquier tipo de elemento que implemente ICloneable.

Si su tipo de elemento no es compatible ICloneablepero tiene un constructor de copia, puede hacer esto en su lugar:

List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);

oldList.ForEach((item)=>
    {
        newList.Add(new YourType(item));
    });

Personalmente, lo evitaría ICloneabledebido a la necesidad de garantizar una copia profunda de todos los miembros. En su lugar, sugeriría que el constructor de copia o un método de fábrica como YourType.CopyFrom(YourType itemToCopy)ese devuelva una nueva instancia de YourType.

Cualquiera de estas opciones podría incluirse en un método (extensión o no).

Jeff Yates avatar Oct 21 '2008 16:10 Jeff Yates

Puede utilizar un método de extensión.

static class Extensions
{
    public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
    {
        return listToClone.Select(item => (T)item.Clone()).ToList();
    }
}
ajm avatar Oct 21 '2008 16:10 ajm