从枚举集合中删除每个循环项

本文关键字:循环 删除 枚举 集合 | 更新日期: 2023-09-27 18:04:02

我不知道为什么会这样:

var list = new List<int>() { 1, 4, 3, 2, 0, 1 };
foreach (var item in list.ToList())
{
    if (item == 1)
    {
        list.Remove(item);
    }
}

var list = new List<int>() { 1, 4, 3, 2, 0, 1 };
foreach (var item in list)
{
    if (item == 1)
    {
        list.Remove(item);
    }
}

如果运行第二个代码片段,它会给你以下错误:

Collection was modified; enumeration operation may not execute.

根据文档,枚举只有在未更改时才有效。我不明白的是我如何能够用第一个代码片段绕过它?谁能给我解释一下吗?

从枚举集合中删除每个循环项

由于.ToList()不是强制转换操作,因此它对原始列表进行复制

那么你就可以副本上迭代修改原始

因为在第一个代码片段中,您不是遍历列表,而是遍历列表的副本

因此,从原始列表中删除一个项不会引起任何异常,因为它与被枚举的集合不同。