简体   繁体   English

C# List.Add 覆盖以前的对象

[英]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.我正在尝试创建一个简单的对象列表,但不知何故在每个 foreach 循环中,以前的记录都被新的循环覆盖,以前的记录被新记录覆盖。 So if there are 6 entries in realData, the list will have 6x the last record.因此,如果 realData 中有 6 个条目,则列表将具有最后一条记录的 6 倍。

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.因此,基本上在每次迭代时,您都会创建一个新的空对象,然后分配该值并将其添加到 List 中。

It happens because you are inserting the same reference of orderItemVM to itemList .发生这种情况是因为您将orderItemVM的相同引用插入到itemList Also, you can set a default size for itemList and boost performance.此外,您可以为itemList设置默认大小并提高性能。

var realData = await _context.OrderItem.ToListAsync();     
var itemList = new List<OrderItemVM>(realData.Count);

And for this task, you can use LINQ:对于此任务,您可以使用 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.感谢 Lasse V. Karlsen 我发现了这个错误。 I moved the line var OrderItemVM = new OrderItemVM in the Foreach-loop.我在 Foreach 循环中移动了行var OrderItemVM = new OrderItemVM That solved it.那解决了它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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