ShoppingCart; Коллекция была изменена; операция перечисления может не выполняться

#c# #asp.net #.net #asp.net-mvc #asp.net-core

#c# #asp.net #.net #asp.net-mvc #asp.net-ядро

Вопрос:

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

Я знаю, что вы не можете изменять список во время цикла, поэтому я попытался работать с Tolist(), но когда я пытаюсь это сделать, он создает только первый объект и перезаписывает, когда я создаю второй.

Я не исправил это, может кто-нибудь помочь мне это исправить?

 [HttpPost, ActionName("Details")]
    [ValidateAntiForgeryToken]
    public IActionResult DetailsPost(int id, DetailsProductViewModel detailsProductViewModel)
    {
        List<ShoppingCart> shoppingCartsList = new List<ShoppingCart>();
        if (HttpContext.Session.Get<IEnumerable<ShoppingCart>>(WC.SessionCart)!=null 
            amp;amp; HttpContext.Session.Get<IEnumerable<ShoppingCart>>(WC.SessionCart).Count() > 0)
        {
            shoppingCartsList = HttpContext.Session.Get<List<ShoppingCart>>(WC.SessionCart);
            foreach (var item in shoppingCartsList)
            {
                if (item.ProductId == id)
                {
                    item.Aantal  = 1;
                }
                else
                {
                    shoppingCartsList.Add(new ShoppingCart { ProductId = id, Aantal = detailsProductViewModel.Product.Aantal });
                }
            }
        }
        else
        {
            shoppingCartsList.Add(new ShoppingCart { ProductId = id, Aantal = detailsProductViewModel.Product.Aantal });
        }
       
        HttpContext.Session.Set(WC.SessionCart, shoppingCartsList);
        return RedirectToAction(nameof(Index));
    }
 

Комментарии:

1. foreach (var item in shoppingCartsList.ToList()) хотя весь цикл выглядит подозрительно. Что вы на самом деле пытаетесь сделать?

2. добавьте новые элементы в другой список, добавьте этот список к исходному, когда закончите цикл. проблема решена, обращение закрыто.

3. к списку() Я уже пробовал, у меня есть сеанс shoppingcart, и когда я добавляю что-то, я сначала хочу посмотреть, есть ли товар уже в корзине. если да, то число будет увеличено, а если нет, то я создам новый объект.

4. Вы не можете добавлять элементы в список, который вы уже просматриваете, простая переработка логики здесь должна помочь. Совет: используйте shoppingCartsList.Any(sc => sc.ProductId == id) , чтобы определить, существует ли продукт, затем вы можете добавлять / редактировать. Или используйте shoppingCartsList.SingleOrDefault(sc => sc.ProductId == id) и проверьте наличие null.

Ответ №1:

вам не нужен цикл. просто попробуйте найти элемент в списке. если найдено, увеличьте сумму, если нет, создайте новую.

 ...//also check your shoppingCartsList is null or not
var product = shoppingCartsList.FirstOrDefault(x=>x.ProductId == id);
if(product == null)
{
 shoppingCartsList.Add(new ShoppingCart { ProductId = id, Aantal = detailsProductViewModel.Product.Aantal });
}
else
{
   product.Aantal  ;
}

HttpContext.Session.Set(WC.SessionCart, shoppingCartsList);
 

Комментарии:

1. спасибо, это действительно имеет больше смысла. это решило проблему 🙂