Tengo una lista genérica de objetos en C#, y deseo clonar la lista. Los elementos dentro de la lista son clonables, pero no parece haber una opción para hacer list.Clone()
.
¿Hay alguna manera fácil de evitar esto?
Si tus elementos son de tipo valor, entonces puedes hacer simplemente:
List<YourType> newList = new List<YourType>(oldList);
Sin embargo, si son tipos de referencia y quieres una copia profunda (asumiendo que tus elementos implementan correctamente ICloneable
), podrías 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, sustituye ICloneable
en los genéricos anteriores y castéalo con el tipo de elemento que implementa ICloneable
.
Si tu tipo de elemento no soporta ICloneable
pero tiene un constructor de copias, puedes 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, evitaría ICloneable
por la necesidad de garantizar una copia profunda de todos los miembros. En su lugar, sugeriría el constructor-copia o un método de fábrica como SuTipo.CopiarDe(SuTipo elementoParaCopiar)
que devuelva una nueva instancia de SuTipo
.
Cualquiera de estas opciones podría ser envuelta por un método (extensión o no).
Para obtener una copia superficial, puede utilizar el método GetRange de la clase genérica List.
List<int> oldList = new List<int>( );
// Populate oldList...
List<int> newList = oldList.GetRange(0, oldList.Count);
Citado de: Recetas Genéricas
Si sólo te importan los tipos de valores...
Y conoces el tipo:
List<int> newList = new List<int>(oldList);
Si no conoces el tipo antes, necesitarás una función de ayuda:
List<T> Clone<T>(IEnumerable<T> oldList)
{
return newList = new List<T>(oldList);
}
El justo:
List<string> myNewList = Clone(myOldList);