Reputation: 693
I am trying to create a simple list of objects, but somehow on every foreach loop the previous records are overwritten by the new one loop the previous record is overwritten by the new record. So if there are 6 entries in realData, the list will have 6x the last record.
Do I somehow recreate the List instead of adding to it? Is there another alternative that I have overlooked to create a List?
My code is
public async Task<IActionResult> OrderOverview()
{
var itemList = new List<OrderItemVM>();
var realData = await _context.OrderItem.ToListAsync();
var orderItemVM = new OrderItemVM();
foreach (var item in realData)
{
orderItemVM.Id = item.Id;
orderItemVM.OrderId = item.OrderId;
orderItemVM.OrderName = _context.Order.Find(item.OrderId).OrderName;
orderItemVM.ItemName = item.ItemName;
itemList.Add(orderItemVM);
}
return View(itemList);
}
Upvotes: 1
Views: 1305
Reputation: 1026
It happens because you are inserting the same reference of orderItemVM
to itemList
.
Also, you can set a default size for itemList
and boost performance.
var realData = await _context.OrderItem.ToListAsync();
var itemList = new List<OrderItemVM>(realData.Count);
And for this task, you can use LINQ:
public async Task<IActionResult> OrderOverview()
{
var realData = await _context.OrderItem.ToListAsync();
var itemList = realData.Select(item => new OrderItemVM
{
Id = item.Id,
OrderId = item.OrderId,
OrderName = _context.Order.Find(item.OrderId).OrderName,
ItemName = item.ItemNam,
}).ToList();
return View(itemList);
}
Upvotes: 2
Reputation: 1214
You are modifying the previously added objects instead of adding a new one. You should do this.
foreach (var item in realData)
{
OrderItemVM orderItemVM = new OrderItemVM ();
orderItemVM.Id = item.Id;
orderItemVM.OrderId = item.OrderId;
orderItemVM.OrderName = _context.Order.Find(item.OrderId).OrderName;
orderItemVM.ItemName = item.ItemName;
itemList.Add(orderItemVM);
}
So, basically on each iteration you create a new empty object and then assign that values and add that in List.
Upvotes: 5
Reputation: 693
Thanks to Lasse V. Karlsen I discovered the error. I moved the line var OrderItemVM = new OrderItemVM
in the Foreach-loop. That solved it.
Upvotes: 0