удаление объектов из универсального Списка <t>

У меня есть следующий метод, я хочу удалить объекты из своего набора, которые соответствуют идентификатору продукта. Кажется довольно прямым, но я получаю исключение. В основном мой набор выходит из синхронизации. Таким образом, что лучший способ состоит в том, чтобы удалить объект из набора.

public void RemoveOrderItem(Model.Order currentOrder, int productId)
{

    foreach (var orderItem in currentOrder.OrderItems)
    {
        if (orderItem.Product.Id == productId)
        {
            currentOrder.OrderItems.Remove(orderItem);
        }
    }
}

Детали исключения: Система. InvalidOperationException: Набор был изменен; операция перечисления не может выполниться

8
задан frosty 8 June 2010 в 08:37
поделиться

6 ответов

Изменение коллекции внутри цикла не работает. Чтобы обойти это, List имеет несколько методов, которые позволяют «пакетные» модификации коллекции. В вашем случае используйте:

currentOrder.OrderItems.RemoveAll(x => x.Product.Id == productId)
28
ответ дан 5 December 2019 в 04:52
поделиться

Как вы понимаете, вы не можете удалить элемент из коллекции, пока вы просматриваете его. Я уверен, что кто-то сможет предоставить более изящное решение 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);
}
1
ответ дан 5 December 2019 в 04:52
поделиться

Вы не можете удалить элемент из коллекции, по которой вы итерируете, вы могли бы отслеживать orderItem, а затем удалить его после завершения цикла

2
ответ дан 5 December 2019 в 04:52
поделиться

Вы не можете изменять коллекцию во время ее итерации. Просто используйте обычный цикл for вместо цикла foreach .

5
ответ дан 5 December 2019 в 04:52
поделиться

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

Простой способ сделать это:

   authorsList.RemoveAll(x => x.ProductId == productId);

или

   authorsList = authorsList.Where(x => x.ProductId!= productId).ToList();
3
ответ дан 5 December 2019 в 04:52
поделиться

"foreach" обеспечивает итерацию коллекции "только для чтения".

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

0
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: