2015-05-06 79 views
0

我想在列表中刪除列表中的鍵值對 但它給了我錯誤消息,如[集合被修改;枚舉操作可能不會執行。例外]刪除列表中的Foreach循環中的鍵值對

這裏是代碼

if (senderRemainingSeqList.Count > 0) 
{ 
     senderRemainingSeqList.Sort(); 

     foreach (var row in senderRemainingSeqList) 
     { 
      if (row.Key == currentSenderID) 
      { 
       if (row.Value == senderNextSeqList[currentSenderID]) 
       { 
       Console.WriteLine("{0} {1}",row.Key,row.Value); 
        senderRemainingSeqList.Remove(row); 
       } 
     } 
}} 

回答

2

您不能修改在收集你的枚舉上,而不是你可以過濾掉不值符合您的條件,並使用ToList將創建一個新的列表,併爲其分配回senderRemainingSeqList

senderRemainingSeqList = senderRemainingSeqList 
       .Where(row=> row.Key != currentSenderID && 
       row.Value != senderNextSeqList[currentSenderID]) 
       .ToList(); 
0

如果要在枚舉過程中修改集合或創建RemoveList並使用它,請使用for循環。

2

您可以在循環複製的初始列表的,所以你可以修改它:

... 
    // Note ToList(); 
    foreach (var row in senderRemainingSeqList.ToList()) { 
    ... 
    } 
    ... 
+0

這實際上很聰明,從來沒有想過它! –

0

嘗試做一個反向循環以避免錯誤,同時消除。

for(int i = list.Count -1; i >= 0; --i) 
{ 
    // Determine if this is the pair you want to remove 
    if(list[i].key == keyToRemove) 
     list.RemoveAt(i); 
} 

你必須向後做,否則該列表可能會改變結構和條目可能會被跳過。