none
Union de listas de objetos RRS feed

  • Pregunta

  • Buenas que tal? soy nuevo en el foro, estuve buscando y mirando millones de post pero no logro dar con este problemita. bueno la cosa es la siguiente. Estoy desarrollando una aplicacion en la cual trabajo con listas de objetos, necesito unir dos listas por un campo en especifico. Tengo un objeto:

    public class eTurnos
        {
            public string DniProf { get; set; }
            public string DniPac { get; set; }
            public DateTime FechaYHora { get; set; }
            public string Asunto { get; set; }
            public string Observaciones { get; set; }
            public int Codigo { get; set; }
        }

    a su ves tengo dos listas de "eTurnos" una que se llena desde la bd a traves de una consulta y otra que la genero mediante un for de la siguiente manera. ahora cuando yo retorno esa union me aparece todo y el remove que tengo dentro del foreach no funciona como que no encuentra el objeto pero esta!!! yo pruebo campo x campo de la entidad y son todos iguales pero no logro eliminarlo de la lista. nose si se entiende lo que necesito hacer... gracias

    Turnos tu = new Turnos(); List<eTurnos> turnosdeldia= tu.ListarTurnosXDia(dia, pro); List<eConfTurnos> listaAtencion = tu.ListarConfiguracionDia(pro, DiaSemana(dia.DayOfWeek)); List<eTurnos> listajunta = new List<eTurnos>(); for (int i = 0; i < listaAtencion.Count; i++) { for (DateTime Hora = listaAtencion[i].Desde; Hora <= listaAtencion[i].Hasta; Hora = Hora.AddMinutes(listaAtencion[i].Intev)) { List<eTurnos> listExiste = tu.ListarCodigoFechaProf(new DateTime(dia.Year, dia.Month, dia.Day, Hora.Hour, Hora.Minute, Hora.Second),pro); if (listExiste.Count != 0) { foreach (eTurnos turnoexistente in listExiste) { listajunta.Add(turnoexistente); turnosdeldia.Remove(turnoexistente); } } else { eTurnos turno = new eTurnos(); turno.DniProf = pro; turno.DniPac = "-1"; turno.FechaYHora = new DateTime(dia.Year, dia.Month, dia.Day, Hora.Hour, Hora.Minute, Hora.Second); turno.Asunto = "-1"; turno.Observaciones = "-1"; turno.Codigo = -1; listajunta.Add(turno); } } } return listajunta.Union(turnosdeldia).ToList();

    jueves, 24 de agosto de 2017 16:20

Todas las respuestas

  • La verdad no se porque no funciona tu código, pero bueno tal vez podríamos intentar de otra manera, tu estas recorriendo tu lista y obtienes item por item, lo adicionas a la lista y luego lo eliminas de la lista original (bueno es lo que yo entiendo), podrías evaluar el llevar la lista entera de la origen a la destino, utilizando el método AddRange()

    https://msdn.microsoft.com/es-es/library/z883w3dc(v=vs.110).aspx

    Que en realidad al final quedaría algo así:

                        .....
                        if (listExiste.Count != 0)
                        {
                            listajunta.AddRange(listExiste);
                        }
                        .....

    Espero que te sirva, si es que no aun podemos evaluar otras alternativas.

    Saludos cordiales.


    Roy Sillerico

    jueves, 24 de agosto de 2017 18:09
  • No se donde estoy cometiendo el error, vos decis que junte toda la lista a una con addrange y depues la recorra y elimine segun el criterio que yo quiera?
    jueves, 24 de agosto de 2017 20:13
  • Si es que no estoy entendiendo mal tu problema y tu código, solamente tendrías que reemplazar la porción de códigoque te proporcione, ya no seria necesario eliminar nada ya que cada que pase por el segundo for la lista listExiste se reemplazaría por uno nuevo, probaste simplemente reemplazando la porción de código que te proporcione???

    Roy Sillerico

    jueves, 24 de agosto de 2017 20:23
  • creo haberlo solucionado de la siguiente manera: 

     
                Turnos tu = new Turnos();
                List<eTurnos> turnosdeldia= tu.ListarTurnosXDia(dia, pro);
                List<eConfTurnos> listaAtencion = tu.ListarConfiguracionDia(pro, DiaSemana(dia.DayOfWeek));
                List<eTurnos> listajunta = new List<eTurnos>();
                
                for (int i = 0; i < listaAtencion.Count; i++)
                {
                    for (DateTime Hora = listaAtencion[i].Desde; Hora <= listaAtencion[i].Hasta; Hora = Hora.AddMinutes(listaAtencion[i].Intev))
                    {
                            eTurnos turno = new eTurnos();
                            turno.DniProf = pro;
                            turno.DniPac = "-1";
                            turno.FechaYHora = new DateTime(dia.Year, dia.Month, dia.Day, Hora.Hour, Hora.Minute, Hora.Second);
                            turno.Asunto = "-1";
                            turno.Observaciones = "-1";
                            turno.Codigo = 1;
                            listajunta.Add(turno);
                    }
                }
    
    
                for(int j=0;j<listajunta.Count;j++)
                {
                    foreach (eTurnos listurnodeldia in turnosdeldia)
                    {
                        if (listajunta[j].FechaYHora== listurnodeldia.FechaYHora)
                        {
                            listajunta.RemoveAt(j);
                        }
    
                    }
                }
             
                return listajunta.Union(turnosdeldia).ToList();
    porque si hago lo que vos me decis me van a faltar items porque yo en la lista "turnosdeldia" tengo items que no van a cumplir la condicion que esten y los necesito igual. 

    jueves, 24 de agosto de 2017 20:31
  • La parte de código que te sugerí reemplazar es:

                            foreach (eTurnos turnoexistente in listExiste)
                            {
                                listajunta.Add(turnoexistente);
                                turnosdeldia.Remove(turnoexistente);
    
                             }
    En la cual no veo que existan condiciones que cumplir, solamente veo un vaciado de items entre listas, pero bueno lo importante es que ya lo solucionaste.

    jueves, 24 de agosto de 2017 20:36