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);
}
您必须向后执行此操作,否则列表可能会改变结构,条目可能会被跳过。这实际上非常聪明,从未想过!那其实很聪明,没想到!