在列表中的Foreach循环中删除键值对

时间:2015-05-06 13:45:24

标签: c# key-value

我希望在显示后从List中删除键值对 但它给了我错误信息,如[收集被修改;枚举操作可能无法执行。例外]

这是代码

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);
               }
         }
}}

4 个答案:

答案 0 :(得分:2)

您无法修改您枚举的收藏集,而是可以过滤掉与您的条件不符的值,并使用ToList创建新列表并将其分配回senderRemainingSeqList:< / p>

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

答案 1 :(得分:2)

您可以循环显示初始列表的 copy ,因此您可以修改它:

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

答案 2 :(得分:0)

如果要在枚举期间修改集合或创建RemoveList并使用它,请使用for循环。

答案 3 :(得分: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);
}

您必须向后执行此操作,否则列表可能会更改结构,并且可能会跳过条目。