¿Cómo clono una lista genérica en C#?
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?
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 ICloneable
los genéricos anteriores y emita con cualquier tipo de elemento que implemente ICloneable
.
Si su tipo de elemento no es compatible ICloneable
pero 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 ICloneable
debido 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).
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();
}
}