none
Clonar lista con Linq RRS feed

  • Pregunta

  • Buenas estoy necesitando clonar el primer item de mi lista, y agregarlo luego dentro de la misma lista N veces. 

    Mi estructura es la siguiente:

    - _LineProgram (Objeto)

    - WeekDayList (Lista1) [Lunes, Martes, Miercoles, etc...] 

    - Shifts (Lista2) [Turno mañana, Turno Tarde, etc...]

    - StopProgramList (Lista3) [Almuerzo, Reunion, etc.. ]

    *Lo que quiero hacer es clonar la lista: Shifts + la lista StopProgram con sus correspondientes items, y agregarlo para los demas días. 

    Adjunto mi Watch:


    José Maria Antunez

    martes, 16 de abril de 2019 13:02

Respuestas

  • Podrias hacer algo asi como esto:

    MiTipo primerObjeto = MiLista[0];
    
    MiLista.Add(primerObjeto.Clone());
    MiLista.Add(primerObjeto.Clone());
    MiLista.Add(primerObjeto.Clone());

    Esto presume que los objetos de la lista tienen un metodo Clone para clonarse. Si no lo tienen, vete a la clase que define dichos objetos e implementa la interfaz ICloneable. Esto se puede hacer de muchas formas, pero si la clase tiene ya un constructor de copia (y si no lo tiene, no causa ningún daño añadirlo), lo mas sencillo el que el Clone llame al constructor de copia pasandole el this.

    Si nos pones aquí un fragmento de código con la definición de tu clase, te podemos mostrar las modificaciones necesarias para añadirle el Clone. Abrevia, por favor: Si la clase tiene cien campos no nos pongas los cien, recórtala y deja solo dos o tres para que sirvan como ejemplo.

    martes, 16 de abril de 2019 14:15
    Moderador

Todas las respuestas

  • Podrias hacer algo asi como esto:

    MiTipo primerObjeto = MiLista[0];
    
    MiLista.Add(primerObjeto.Clone());
    MiLista.Add(primerObjeto.Clone());
    MiLista.Add(primerObjeto.Clone());

    Esto presume que los objetos de la lista tienen un metodo Clone para clonarse. Si no lo tienen, vete a la clase que define dichos objetos e implementa la interfaz ICloneable. Esto se puede hacer de muchas formas, pero si la clase tiene ya un constructor de copia (y si no lo tiene, no causa ningún daño añadirlo), lo mas sencillo el que el Clone llame al constructor de copia pasandole el this.

    Si nos pones aquí un fragmento de código con la definición de tu clase, te podemos mostrar las modificaciones necesarias para añadirle el Clone. Abrevia, por favor: Si la clase tiene cien campos no nos pongas los cien, recórtala y deja solo dos o tres para que sirvan como ejemplo.

    martes, 16 de abril de 2019 14:15
    Moderador
  • hola

    a que llamas clonar ?

    ya habia planteado este tema

    Agregar o copiar una lista dentro de otra.


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Carlos_Ruiz_M martes, 16 de abril de 2019 14:36
    martes, 16 de abril de 2019 14:20
  • Lo que hice es guardar el primer registro de la lista WeekDayList y almacenarlo en una variable. 

    var Clone = _LineProgram.WeekDayList.FirstOrDefault();

    Pero ahora lo que quiero hacer, es agregar eso a la misma lista. 

    Y hacia N veces para los siguientes días.


    José Maria Antunez


    martes, 16 de abril de 2019 14:36
  • hola

    Pero ahora lo que quiero hacer, es agregar eso a la misma lista.   Y hacia N veces para los siguientes días.

    podris iterar la lista

    var items = _LineProgram.WeekDayList.Skip(1);

    foreach(var item in items){

       item.WeekDayList = item;

    }

    igual esto ser auna asignacion por referencia, si modificas algun dato de cualquier item de la lista afectara al resto, salvo que realices un Clone()

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Carlos_Ruiz_M martes, 23 de abril de 2019 15:07
    martes, 16 de abril de 2019 16:55