Charles de M.
Charles de M.

Reputation: 693

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

Upvotes: 1

Views: 1305

Answers (3)

Support Ukraine
Support Ukraine

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

Hammas
Hammas

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

Charles de M.
Charles de M.

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

Related Questions