这是我的代码:
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语句,则结果是正确的。 为什么会这样?
答案 0 :(得分:2)
在第一个循环中,您的控件为零。 您删除控件。 您的下一个循环将获取下一个控件。由于它已经返回了第一个控件,因此现在返回了第二个控件,但是由于您已经删除了“零”控件,因此第二个控件现在是2。
了解此行为的关键是OfType()返回一个迭代器,而不是列表。如果返回OfType()。ToList(),则会得到一个具体列表,当您更改从其衍生的列表时,该列表将不会更改。
所以;
generate_instruction
答案 1 :(得分:0)
当您删除列表中的对象时,您要遍历的对象也会更改其长度。
如果要以这种方式删除所有元素,则可以向后遍历列表,这样就不会偏移列表并使您错过元素。