C# List.Add перезаписывает предыдущие объекты - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь создать простой список объектов, но каким-то образом на каждом foreach l oop предыдущие записи перезаписываются новым l oop предыдущая запись перезаписывается новой записью. Таким образом, если в 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);
    }

Ответы [ 3 ]

4 голосов
/ 02 апреля 2020

Вы изменяете ранее добавленные объекты вместо добавления нового. Ты должен сделать это.

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

Итак, в основном на каждой итерации вы создаете новый пустой объект, а затем присваиваете значения и добавляете их в список.

2 голосов
/ 02 апреля 2020

Это происходит потому, что вы вставляете ту же ссылку от 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);
    }
0 голосов
/ 02 апреля 2020

Благодаря Лассе В. Карлсену я обнаружил ошибку. Я переместил строку var OrderItemVM = new OrderItemVM в Foreach-l oop. Это решило это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...