简体   繁体   中英

C# List.Add overwrites previous objects

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);
    }

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.

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);
    }

Thanks to Lasse V. Karlsen I discovered the error. I moved the line var OrderItemVM = new OrderItemVM in the Foreach-loop. That solved it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM