Estoy tratando de asignar la siguiente clase a una clase de destino usando el siguiente código. Aquí tratando de asignar la clase de empleado a
static void Main(string[] args) { var emp = new List<Employee>() { new Employee() { FirstName = "Test", LastName = "Performance", ID="1", Availabities = new List<Availability>() { new Availability() { BeginDate = DateTime.Now, EndDate = DateTime.Now.AddDays(1) } } }, new Employee() { FirstName = "Test1", LastName = "Performance1", ID="2", Availabities = new List<Availability>() { new Availability() { BeginDate = DateTime.Now, EndDate = DateTime.Now.AddDays(10) } } }, new Employee() { FirstName = "Test123", LastName = "Performance1", ID="3", Availabities = new List<Availability>() { new Availability() { BeginDate = DateTime.Now, EndDate = DateTime.Now.AddDays(5) }, new Availability() { BeginDate = DateTime.Now, EndDate = DateTime.Now.AddDays(3) } } } };Aquí está la asignación de objetos de destino, aquí el empleado que se asignará con EmployeeDest.
List<AvailabilityDest> empAvailabilitiesDest = new List<AvailabilityDest>(); var results = new List<EmployeeDest>(); foreach (var token in emp) { empAvailabilitiesDest.Clear(); foreach (var item in token.Availabities) { var empAvailability = new AvailabilityDest { BeginDateDest = item.BeginDate, EndDateDest = item.EndDate, }; empAvailabilitiesDest.Add(empAvailability); } var employee = new EmployeeDest { FirstNameDest = token.FirstName, LastNameDest = token.LastName, IDDest =token.ID, AvailabitiesDest = empAvailabilitiesDest }; results.Add(employee); } Console.WriteLine(results); } Aquí empAvailabilitiesDest.Clear() no borra la lista y availabilityDest aumenta con cada iteración.
Yo me estoy perdiendo algo aqui .
Presumiblemente, el problema real aquí es que todos sus objetos de empleados comparten la misma lista; no importa si lo borra, agrega cosas, etc.: si hay una lista y se comparte entre todos los empleados, los cambios en esa lista se mostrarán en todos los empleados y aparecerán incorrectos.
Presumiblemente, solo desea mover la creación de la lista dentro del foreach por empleado:
var results = new List<EmployeeDest>(); foreach (var token in emp) { List<AvailabilityDest> empAvailabilitiesDest = new List<AvailabilityDest> (); // your previous code unchanged }1. Problema en tu código
var employee = new EmployeeDest { FirstNameDest = token.FirstName, LastNameDest = token.LastName, IDDest = token.ID, AvailabitiesDest = empAvailabilitiesDest // This is problematic code };Debido al código anterior, cada empleado.AvailabitiesDest hará referencia al mismo objeto porque no es una variable de tipo primitivo. Debe asignar una copia del objeto a employee.AvailabitiesDest,
var employee = new EmployeeDest { FirstNameDest = token.FirstName, LastNameDest = token.LastName, IDDest = token.ID, AvailabitiesDest = new List<AvailabilityDest>(empAvailabilitiesDest) };2. Código simplificado
Usa Linq.
results = emp.Select(token => new EmployeeDest { FirstNameDest = token.FirstName, LastNameDest = token.LastName, IDDest = token.ID, AvailabitiesDest = token.Availabities.Select(item => new AvailabilityDest { BeginDateDest = item.BeginDate, EndDateDest = item.EndDate, }).ToList() }).ToList();O use AutoMapper
var mapper = new Mapper(new MapperConfiguration(cfg => { cfg.CreateMap<Employee, EmployeeDest>() .ForMember(x => x.FirstNameDest, opt => opt.MapFrom(src => src.FirstName)) .ForMember(x => x.LastNameDest, opt => opt.MapFrom(src => src.LastName)) .ForMember(x => x.IDDest, opt => opt.MapFrom(src => src.ID)) .ForMember(x=> x.AvailabitiesDest, opt => opt.MapFrom(src => src.Availabities)); cfg.CreateMap<Availability, AvailabilityDest>() .ForMember(x => x.BeginDateDest, opt => opt.MapFrom(src => src.BeginDate)) .ForMember(x => x.EndDateDest, opt => opt.MapFrom(src => src.EndDate)); })); var results = mapper.Map<List<EmployeeDest>>(emp);