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

C# 删除列表中Foreach循环中的键值对,c#,key-value,C#,Key Value,我想在显示一个键值对后将其从列表中删除 但它会给我错误消息,如[集合已修改;枚举操作可能无法执行。异常] 这是代码 if (senderRemainingSeqList.Count > 0) { senderRemainingSeqList.Sort(); foreach (var row in senderRemainingSeqList) { if ( row.Key == currentSenderID)

我想在显示一个键值对后将其从列表中删除 但它会给我错误消息,如[集合已修改;枚举操作可能无法执行。异常]

这是代码

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

您不能修改正在枚举的集合,而是可以筛选出与条件不匹配的值,然后使用
ToList
创建一个新列表,并将其分配回您的
senderRemainingSeqList

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

您不能修改正在枚举的集合,而是可以筛选出与条件不匹配的值,然后使用
ToList
创建一个新列表,并将其分配回您的
senderRemainingSeqList

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

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

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

您可以在初始列表的副本上循环,因此您可以修改它:

  ...
  // Note ToList(); 
  foreach (var row in senderRemainingSeqList.ToList()) {
    ...
  }
  ...
您可以循环初始列表的副本,因此您可以修改它:

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

尝试进行反向循环,以避免删除时出错

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

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

尝试执行反向循环,以避免删除时出错

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

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

这实际上非常聪明,从未想过!那其实很聪明,没想到!