为什么不能为每个循环修改一个集合

时间:2012-05-09 06:45:19

标签: c# .net iterator

如果你复制它,为什么能最好地解释为什么要使用foreach替换正在循环的集合的元素。示例:

foreach(Item item in Items)
{
   item.modify //or remove or add
}
// will not work

foreach(Item item in Items.ToList())
{
   item.modify //or remove. or add
}

//will work altough i dont get it because i am now iterating trough the temporary list
//and changing its elements. 
//In my understanding its not like im iterating the list(.ToList) and modifying the source items
//(Items). A graphic representation would be welcome, my interest is to understand the
//matter logically

3 个答案:

答案 0 :(得分:0)

因为Enumerator会转发集合中count个元素,并且在迭代过程中您不会更改它。

如果您复制了列表(回答您的问题),则会迭代您正在更改的集合的副本。就是这样。

答案 1 :(得分:-1)

最佳答案是List会对其列表项进行某种跟踪,并且可以按照您的要求更新其项目,但是简单的IEnumerable不会这样,因此它不允许您更改它们。

答案 2 :(得分:-1)

您的商品是什么类型的?修改方法有什么作用?我无法重现你可以用第二个选项做什么。我无法编译:

int[] nn = new int[] { 1, 2 };
foreach (var n in nn.ToList())
   n++;

错误:无法分配给'n',因为它是'foreach迭代变量'