2010-06-08 90 views
8

我有以下方法,我希望從我的集合中刪除與產品ID匹配的項目。似乎相當直接,但我得到一個例外。基本上我的收藏不同步。那麼從集合中刪除項目的最佳方式是什麼?從通用列表中刪除項目<t>

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

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

異常詳細信息:System.InvalidOperationException:集合已被修改;枚舉操作可能不會執行

回答

27

在循環內修改集合不起作用。要解決這個問題,List有幾個方法可以對一個集合進行「批量」修改。在你的情況下,使用:

currentOrder.OrderItems.RemoveAll(x => x.Product.Id == productId) 
+0

感謝康拉德,奇怪我不能讓lamda工作。它不識別「x.Product.Id」部分。奇怪的cos以下工作 var query = from currentOrder.OrderItems中的x其中x.Product.Id == productId select x;集合類型是ISet。 – frosty 2010-06-08 09:37:44

+0

好的,我回答了我自己的問題:)我已將此更改爲列表 frosty 2010-06-08 09:41:58

4

你不能修改集合,而迭代它。只需使用正常的for循環代替foreach循環即可。

+0

:)這對我來說是最好的解決方案 – EagleFox 2013-07-12 21:37:34

2

您不能從您通過遍歷集合中刪除某個項目,你可以跟蹤OrderItem的的,然後將其刪除完成循環

3

後,通過循環這種方式,你不能刪除,因爲它在項目收集它保持存儲項目的軌道。

簡單的方法來做到這一點:

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

authorsList = authorsList.Where(x => x.ProductId!= productId).ToList(); 
1

正如你知道,而你是遍歷它,你不能從一個集合中刪除的項目。我相信會有人能夠提供一個整潔的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); 
} 
+0

Konrad Rudolph給出了LINQ解決方案 – openshac 2010-06-08 08:44:46

+0

請注意'List .RemoveAll'在.NET中可用2.0並且在技術上不是LINQ,儘管它看起來很相似。對於那些必須保持Windows 2000兼容性的可憐靈魂來說,這比LINQ要大得多。 – OregonGhost 2010-06-08 09:01:05

0

「的foreach」提供了一個集合的「只進只讀」的迭代。

作爲一種解決方法,您可以將引用複製到另一個集合,然後遍歷複製的集合並從原始集合中刪除項目。