У меня есть следующий метод, я хочу удалить объекты из своего набора, которые соответствуют идентификатору продукта. Кажется довольно прямым, но я получаю исключение. В основном мой набор выходит из синхронизации. Таким образом, что лучший способ состоит в том, чтобы удалить объект из набора.
public void RemoveOrderItem(Model.Order currentOrder, int productId)
{
foreach (var orderItem in currentOrder.OrderItems)
{
if (orderItem.Product.Id == productId)
{
currentOrder.OrderItems.Remove(orderItem);
}
}
}
Детали исключения: Система. InvalidOperationException: Набор был изменен; операция перечисления не может выполниться
Изменение коллекции внутри цикла не работает. Чтобы обойти это, List
имеет несколько методов, которые позволяют «пакетные» модификации коллекции. В вашем случае используйте:
currentOrder.OrderItems.RemoveAll(x => x.Product.Id == productId)
Как вы понимаете, вы не можете удалить элемент из коллекции, пока вы просматриваете его. Я уверен, что кто-то сможет предоставить более изящное решение LINQ, но сначала вам должно помочь следующее:
public void RemoveOrderItem(Model.Order currentOrder, int productId)
{
var selectedOrderItem = null;
foreach (var orderItem in currentOrder.OrderItems)
{
if (orderItem.Product.Id == productId)
{
selectedOrderItem = orderItem;
break;
}
}
if(selectedOrderItem != null)
currentOrder.OrderItems.Remove(selectedOrderItem);
}
Вы не можете удалить элемент из коллекции, по которой вы итерируете, вы могли бы отслеживать orderItem, а затем удалить его после завершения цикла
Вы не можете изменять коллекцию во время ее итерации. Просто используйте обычный цикл for
вместо цикла foreach
.
Используя такой цикл, вы не можете удалять элементы, потому что, находясь в коллекции, он отслеживает сохраненные элементы.
Простой способ сделать это:
authorsList.RemoveAll(x => x.ProductId == productId);
или
authorsList = authorsList.Where(x => x.ProductId!= productId).ToList();
"foreach" обеспечивает итерацию коллекции "только для чтения".
В качестве обходного пути можно скопировать ссылку на другую коллекцию, а затем выполнить итерацию по скопированной коллекции и удалить элементы из исходной.