Foreach循环跳过现有项目

时间:2018-10-14 20:12:53

标签: c#

这是我的代码:

 int k = panel.Controls.OfType<DataGridView>().Count<DataGridView>();
            foreach (Control control in panel.Controls.OfType<DataGridView>())
            {
                panel.Controls.Remove(control);
            }

我在面板上有4个DataGridView对象,它们在运行时创建,名称分别为0、1、2和3,“ k”表示正确的值(4)。但是我的foreach循环的第一步是“ 0”,第二步是“ 2”,然后循环结束。它跳过了两个对象,我不知道为什么。

如果我输入第二和第三条foreach语句,则结果是正确的。 为什么会这样?

2 个答案:

答案 0 :(得分:2)

在第一个循环中,您的控件为零。 您删除控件。 您的下一个循环将获取下一个控件。由于它已经返回了第一个控件,因此现在返回了第二个控件,但是由于您已经删除了“零”控件,因此第二个控件现在是2。

了解此行为的关键是OfType()返回一个迭代器,而不是列表。如果返回OfType()。ToList(),则会得到一个具体列表,当您更改从其衍生的列表时,该列表将不会更改。

所以;

generate_instruction

答案 1 :(得分:0)

当您删除列表中的对象时,您要遍历的对象也会更改其长度。

  1. 第一次迭代时,索引为0,长度为4。
  2. 第二次迭代位于索引1(本项最初为索引2),长度为3。
  3. 然后您的循环将终止,因为您位于索引2,但是该索引不再有任何元素,因为那里的元素现在位于索引0和1。

如果要以这种方式删除所有元素,则可以向后遍历列表,这样就不会偏移列表并使您错过元素。