foreach循环项从枚举集合中删除

时间:2014-05-19 02:35:51

标签: c# foreach enumeration

我无法弄清楚为什么会这样:

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.

根据文档,枚举仅在未更改时仍然有效。我没有得到的是我如何通过第一个代码片段绕过它?有人可以为我分解吗?

2 个答案:

答案 0 :(得分:4)

因为在第一个代码段中,您没有遍历列表,所以您正在迭代列表的副本

因此,从原始列表中删除项目不会导致任何异常,因为它与正在枚举的集合不同。

答案 1 :(得分:4)

由于.ToList()不是投射操作,因此会生成原始列表的副本

然后,您迭代覆盖副本修改 原始