[英]C# List.Add overwrites previous objects
我正在嘗試創建一個簡單的對象列表,但不知何故在每個 foreach 循環中,以前的記錄都被新的循環覆蓋,以前的記錄被新記錄覆蓋。 因此,如果 realData 中有 6 個條目,則列表將具有最后一條記錄的 6 倍。
我是否以某種方式重新創建列表而不是添加到列表中? 是否有另一種我忽略的替代方法來創建列表?
我的代碼是
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);
}
您正在修改先前添加的對象,而不是添加新對象。 你應該做這個。
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);
}
因此,基本上在每次迭代時,您都會創建一個新的空對象,然后分配該值並將其添加到 List 中。
發生這種情況是因為您將orderItemVM
的相同引用插入到itemList
。 此外,您可以為itemList
設置默認大小並提高性能。
var realData = await _context.OrderItem.ToListAsync();
var itemList = new List<OrderItemVM>(realData.Count);
對於此任務,您可以使用 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);
}
感謝 Lasse V. Karlsen 我發現了這個錯誤。 我在 Foreach 循環中移動了行var OrderItemVM = new OrderItemVM
。 那解決了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.