Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: BlaineMonkey en 16 Febrero 2010, 12:46 pm



Título: Copiar un List en otro (Por valor no por referencia)
Publicado por: BlaineMonkey en 16 Febrero 2010, 12:46 pm
¿Hay algún método que copie de un List a otro sin que sea por referencia? Es decir que pueda modificar cualquiera de los dos y los cambios no se afecten en ambos List.

He probado a pasarle la lista en el constructor, pero esto lo hace por referencia.

¿La única manera es recorrer la lista original e ir creando los nuevos objetos con los mismos valores que la original?


Título: Re: Copiar un List en otro (Por valor no por referencia)
Publicado por: raul338 en 16 Febrero 2010, 13:41 pm
Exacto....sino serializas la lista en memoria y despues lo vuelcas a la nueva lista. Obtienes una nueva lista literalmente igual a la primera, pero no son las mismas (con que cambies una, no cambia la otra)

http://msdn.microsoft.com/es-es/library/bb972188.aspx

es un ejemplo un poco largo, se puede "achicar", aunque no encuentro el articulo originial de donde lo aprendi :-\


Título: Re: Copiar un List en otro (Por valor no por referencia)
Publicado por: BlaineMonkey en 17 Febrero 2010, 12:33 pm
Gracias por tu ayuda. Me ha servido.


Título: Re: Copiar un List en otro (Por valor no por referencia)
Publicado por: raul338 en 17 Febrero 2010, 13:35 pm
Encontre mi proyecto de ejemplo :P
Si tienes esta clase (no importa que tenga propiedades, eventos, etc, se copia igual ;-)
Código
  1. Class Persona
  2.   Public Nombre as String
  3.   Public Apellido as String
  4. End Class
  5.  

Lo que haces es agregarle el atributo Serializable, y si quieres la interfaz IClonable que te agrega el metodo Clone (aunque no recuerdo porque no me funciono a mi, asi que implemente el metodo Clonar solo :P
No olvides de importar los espacios de nombres, son vitales para que funcione el codigo

Te quedaria asi

Código
  1. Imports System.Runtime.Serialization
  2. Imports System.Runtime.Serialization.Formatters.Binary
  3. Imports System.IO
  4.  
  5. <Serializable()> _
  6. Class Persona
  7.   Public Nombre as String
  8.   Public Apellido as String
  9.  
  10.   Public Function Clonar() As Persona
  11.   End Function
  12. End Class
  13.  

y en la funcion Clonar pones esto:

Código
  1.        Dim clon As Persona  ' Objeto donde se va a copiar por valor
  2.  
  3.        ' Serializadores, objeto en memoria
  4.        Dim formatter As IFormatter = New BinaryFormatter()
  5.        Dim str As Stream = New MemoryStream()
  6.  
  7.        formatter.Serialize(str, Me)  ' Copiamos a un stream en la memoria
  8.        str.Seek(0, SeekOrigin.Begin) ' Vamos al principio para volver a "leer"
  9.        clon = CType(formatter.Deserialize(str), Persona) ' Lo leemos y lo guardamos en el objeto "clonado"
  10.  
  11.        Return clon
  12.  

Por lo cual todo junto te quedaria asi:

Código
  1. Imports System.Runtime.Serialization
  2. Imports System.Runtime.Serialization.Formatters.Binary
  3. Imports System.IO
  4.  
  5. <Serializable()> _
  6. Class Persona
  7.   Public Nombre as String
  8.   Public Apellido as String
  9.  
  10.   Public Function Clonar() As Persona
  11.        Dim clon As Persona
  12.  
  13.        Dim formatter As IFormatter = New BinaryFormatter()
  14.        Dim str As Stream = New MemoryStream()
  15.  
  16.        formatter.Serialize(str, Me)
  17.        str.Seek(0, SeekOrigin.Begin)
  18.        clon = CType(formatter.Deserialize(str), Persona)
  19.  
  20.        Return clon
  21.   End Function
  22. End Class
  23.  

Tal vez alguno diga que tenga un par de bugs o algo asi. Nose, a mi me funciono  ;-) jeje

Espero que te sirva!

Nota: La funcion Clonar esa sirve literalmente para cualquier cosa, se puede adaptar para clonar cualquier clase del net framework (el unico requisito es que sea serializable ovbio no? :P)


Título: Re: Copiar un List en otro (Por valor no por referencia)
Publicado por: Skeletron en 18 Febrero 2010, 02:48 am
Tio.. creo que existe el metodo CLONE o COPY en los arrays... ese metodo hace la COPIA.. sin referencia...
Si mal no recuerdo


Título: Re: Copiar un List en otro (Por valor no por referencia)
Publicado por: raul338 en 18 Febrero 2010, 13:16 pm
Solo en los arrays. El metodo que di funciona (sean arrays o no) para clases personalizadas uqe por defecto se copian por referencia