elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 05:14  


Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderador: [D4N93R])
| | | |-+  Copiar un List en otro (Por valor no por referencia)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Copiar un List en otro (Por valor no por referencia)  (Leído 2,877 veces)
BlaineMonkey

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Copiar un List en otro (Por valor no por referencia)
« en: 16 Febrero 2010, 12:46 »

¿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?


« Última modificación: 16 Febrero 2010, 12:49 por BlaineMonkey » En línea
raul338


Desconectado Desconectado

Mensajes: 2.371


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Copiar un List en otro (Por valor no por referencia)
« Respuesta #1 en: 16 Febrero 2010, 13:41 »

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 :-\


En línea

BlaineMonkey

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Re: Copiar un List en otro (Por valor no por referencia)
« Respuesta #2 en: 17 Febrero 2010, 12:33 »

Gracias por tu ayuda. Me ha servido.
En línea
raul338


Desconectado Desconectado

Mensajes: 2.371


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Copiar un List en otro (Por valor no por referencia)
« Respuesta #3 en: 17 Febrero 2010, 13:35 »

Encontre mi proyecto de ejemplo :P
Si tienes esta clase (no importa que tenga propiedades, eventos, etc, se copia igual ;-)
Código
Class Persona
  Public Nombre as String
  Public Apellido as String
End Class
 

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
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO
 
<Serializable()> _
Class Persona
  Public Nombre as String
  Public Apellido as String
 
  Public Function Clonar() As Persona
  End Function
End Class
 

y en la funcion Clonar pones esto:

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

Por lo cual todo junto te quedaria asi:

Código
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO
 
<Serializable()> _
Class Persona
  Public Nombre as String
  Public Apellido as String
 
  Public Function Clonar() As Persona
       Dim clon As Persona
 
       Dim formatter As IFormatter = New BinaryFormatter()
       Dim str As Stream = New MemoryStream()
 
       formatter.Serialize(str, Me)
       str.Seek(0, SeekOrigin.Begin)
       clon = CType(formatter.Deserialize(str), Persona)
 
       Return clon
  End Function
End Class
 

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)
« Última modificación: 17 Febrero 2010, 13:40 por raul338 » En línea

Skeletron


Desconectado Desconectado

Mensajes: 1.686


A long way to go


Ver Perfil WWW
Re: Copiar un List en otro (Por valor no por referencia)
« Respuesta #4 en: 18 Febrero 2010, 02:48 »

Tio.. creo que existe el metodo CLONE o COPY en los arrays... ese metodo hace la COPIA.. sin referencia...
Si mal no recuerdo
En línea

raul338


Desconectado Desconectado

Mensajes: 2.371


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Copiar un List en otro (Por valor no por referencia)
« Respuesta #5 en: 18 Febrero 2010, 13:16 »

Solo en los arrays. El metodo que di funciona (sean arrays o no) para clases personalizadas uqe por defecto se copian por referencia
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como cambiar valor de otro objeto?
Java
greenselves 1 1,344 Último mensaje 22 Marzo 2011, 19:00
por Debci
[DUDA] paso por valor o por referencia (byval/ byref)
Programación Visual Basic
AlxSpy 8 1,038 Último mensaje 12 Julio 2011, 15:45
por AlxSpy
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines