我无法弄清楚为什么会这样:
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.
根据文档,枚举仅在未更改时仍然有效。我没有得到的是我如何通过第一个代码片段绕过它?有人可以为我分解吗?
答案 0 :(得分:4)
因为在第一个代码段中,您没有遍历列表,所以您正在迭代列表的副本。
因此,从原始列表中删除项目不会导致任何异常,因为它与正在枚举的集合不同。
答案 1 :(得分:4)
由于.ToList()
不是投射操作,因此会生成原始列表的副本。
然后,您迭代覆盖副本并修改 原始。