none
copiar un List<double> en otro List<double> RRS feed

  • Pregunta

  • Hola,

    Trabajo con Visual C# 2010 express.

    Es solo una comprobación

    Quisiera copiar lo que tengo en  Xverticeparcela en Xverticeaux.

    Primero tengo esto:

    List<double> Xverticeparcela = new List<double>(); 
            List<double> Xverticeaux = new List<double>();

    Posteriormente en un método pongo esto:

    Xverticeaux = Xverticeparcela;

    En principio creia que con esto valia, pero despues obtengo cosas raras, no se bien como explicarlo, entonces al hacer Xverticeaux = Xverticeparcela;

    ¿Se copia todos los datos de la lista Xverticeparcela en Xverticeaux?

    Gracias


    Alfonso

    • Cambiado webJoseModerator miércoles, 10 de octubre de 2012 6:06 (De:Windows Forms)
    martes, 9 de octubre de 2012 21:57

Respuestas

  • Eso le sucede porque está redefiniendo la variable como una variable local.

    Para usar las colecciones que declaró a nivel de clase usted debe omitir el tipo de la variable.  Si lo pone, entonces está declarando una variable nueva.

    Dentro del evento click usted debe hacer:   Xverticeaux = new List<double>(Xverticeparcela); Como verá, no dice List<double> al inicio.


    Jose R. MCP
    Code Samples

    • Propuesto como respuesta cutuche miércoles, 10 de octubre de 2012 16:16
    • Marcado como respuesta Eder CostaModerator jueves, 11 de octubre de 2012 11:51
    miércoles, 10 de octubre de 2012 15:41
    Moderador

Todas las respuestas

  • Sería así:

    List<double> lista1 = new List<double>();
    //Llene lista1.
    ...
    //Ahora cree un duplicado de la lista:
    List<double> lista2 = new List<double>(lista1);
    //Listo.  Ahora lista2 es una copia de lista1.
    //Eso sí, nuevos elementos en lista1 no aparecerán en lista2
    //mágicamente.


    Jose R. MCP
    Code Samples

    miércoles, 10 de octubre de 2012 6:06
    Moderador
  • hola

    How do I clone a generic list in C#?

    Cloning List<T>

    la tecnica de deepclone que plantea el segundo link en dodne se serializa a binario en memoria la lista y se vuelve a recuperar en la segunda es una excelente tecnica

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 10 de octubre de 2012 6:15
  • Hola de nuevo,

    He probado lo de webJose y no me funciona.

    He mirado lo de Leandro y me lio un motón.

    Explico lo que quiero hacer.

    Tengo un groupBox(para cargar datos double en una list) en pantalla que permite al usuario cargar en una lista (list) datos de tipo double, dicha groupBox la oculto o la muestra cuando el usuario quiere cargar dichos datos double. Una vez que los carga los daots da a un boton aceptar que esta dentro del groupBox y los datos quedan guardados, pero tambien tengo el boton cancelar que lo que busco es que si cancela en dicho groupBox no se guarde nada (se desestime) lo realizado desde la última vez que entro en el groupBox, de esta forma la lista (list) quedara como antes de entrar en el groupBox.

    No se si me explico.

    Había pensado crear una lista A y una B.

    List<double> A = new List<double>(); 
            List<double> B = new List<double>();

    Cuando pulso el boton de mostrar el groupBox entonces:

    Copiar a la lista B lo que tengo en la lista A.

    Cada vez que el usuario añada un "double" lo hara sobre la lista B.

    Al final:

    *si pulso aceptar en el groupBox, copio lo que tengo en la lista B a la lista A.

    *Si pulso cancelar no copio nada y me sigo quedando con lo que tenia la lista A.

    Alguien tiene un ejemplo.

    Gracias


    Alfonso


    • Editado cutuche1 miércoles, 10 de octubre de 2012 12:33 Información adicional
    miércoles, 10 de octubre de 2012 11:19
  • He mirado lo de Leandro y me lio un motón.

    porque te lias si es cpiar y pegar el metodo que alli comente del deepclone()

    Tengo un groupBox(para cargar datos double en una list) en pantalla que permite al usuario cargar en una lista

    pero no veo que relacion hay entre un groupbox y una lista de double? porque este groupbox no muestra datos de lista solo agrupa controles, no sera que debes usar un listbox, ademas para la lista no es que usas un List<double> porque seria esta la que deberias trabajar y no el control como lo muestras

    ademas para ahcer lo que plantras no se necesita clonar nada, simplemente haces limpias la lista o la vuelves a cargar si es que se cancela

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 10 de octubre de 2012 12:37
  • Hola,

    Sigo mirando y en el enlacde que me pones (Tuttini) no veo ningún método deepclone. no se si te refieres a deepcopy.

    En cuanto a tu último comentario:

    ademas para ahcer lo que plantras no se necesita clonar nada, simplemente haces limpias la lista o la vuelves a cargar si es que se cancela

    Limpiar la lista si se, pero volver a cargarla no se como se hace. ¿Me lo podriais indicar?

    Gracias

    miércoles, 10 de octubre de 2012 13:35
  • He probado lo de webJose y no me funciona.

    ¿Qué es lo que no le funciona?  Muestre el código que usó para probar para determinar si existe algún problema en él.


    Jose R. MCP
    Code Samples

    miércoles, 10 de octubre de 2012 14:39
    Moderador
  • Hola,

    Voy a intentar explicarme tengo esto:

    public partial class Form_principal : Form
        {
            public Form_principal()
            {
                InitializeComponent();
            }
            #region Variables y constantes necesarias.
            /*Creo las variables y constantes publicas que necesitare despues*/
            public double X =  470000;
            ..

            List<double> Xverticeparcela = new List<double>(); //Guardo las coor X de los vertices
            List<double> Xverticeaux = new List<double>(); //Guardo las coor X de los vertices aux

          .....

    private void button_Parametros_Viña_Click(object sender, EventArgs e)
            {
               /*desactivo todos los elementos no necesarios para centrarme en ventana parametros viña*/

                groupBox_hidraulico.Visible = false;
                groupBox_Datos_posi_Viña.Visible = false;
                groupBox_Parametros_Viña.Visible = true;
                button_ConectarGPS.Visible = false;
                button_DesconectarGPS.Visible = false;
                button_dirección.Visible = false;
                button_Iniciar.Visible = false;
                button_Parametros_Viña.Visible = false;
                button_PropiedadesGPS.Visible = false;
                button_Salir.Visible = false;
                button_posicion_parcela.Visible = false;
                button_posicion_viña.Visible = false;
                /*Coloco la ventana en la parte central*/
                Point coordenadas=new Point(25,25);
                groupBox_Parametros_Viña.Location = coordenadas;
               
               
                //Guardo los datos en el auxiliar para al final volver a guardarlo o no en
                //funcion que aceptemos o cancelemos
                List<double> Xverticeaux = new List<double>(Xverticeparcela);

               
                //Determino el número de puntos de la parcela 
                label_puntos_perimetro_parcela.Text = "Puntos perímetro parcela: " + Xverticeparcela.Count;

                     }

    .....

    private void button_Aceptar_Parametros_Viña_Click_1(object sender, EventArgs e)
            {

               List<double> Xverticeparcela=new List<double>(Xverticeaux);
                label_puntos_perimetro_parcela.Text = "Puntos perimetro parcela:  " + Xverticeparcela.Count;

    }

    ...

    He señalado donde puedo tener el error.

    Cuando pulso el  button_Parametros_Viña hace visible el groupBox_Parametros_Viña.Visible = true; y aqui añado datos a Xverticeaux (por ejemplo 4 datos), cuando pulso el boton aceptar que esta dentro del groupBox_Parametros_viña me muestra correctamente el numero de vertices "label_puntos_perimetro_parcela.Text = "Puntos perimetro parcela:  " + Xverticeparcela.Count;" y hace invisible el groupBox_Parametros_Viña.

    Pero al volver a pulsar button_Parametros_Viña me muestra Puntos perimetro parcela : 0 (cuando debería mostrar los puntos que tenia en mi ejemplo 4)

    Gracias 

    miércoles, 10 de octubre de 2012 15:14
  • Eso le sucede porque está redefiniendo la variable como una variable local.

    Para usar las colecciones que declaró a nivel de clase usted debe omitir el tipo de la variable.  Si lo pone, entonces está declarando una variable nueva.

    Dentro del evento click usted debe hacer:   Xverticeaux = new List<double>(Xverticeparcela); Como verá, no dice List<double> al inicio.


    Jose R. MCP
    Code Samples

    • Propuesto como respuesta cutuche miércoles, 10 de octubre de 2012 16:16
    • Marcado como respuesta Eder CostaModerator jueves, 11 de octubre de 2012 11:51
    miércoles, 10 de octubre de 2012 15:41
    Moderador