好吧,所以我没有被允许对这个帖子发表评论,我发现问这个问题的作者,所以希望谢尔盖(对不起,如果我拼错了)看到这个。我有8个Label控件是动态制作的,当我使用他提供的代码时:
foreach (Label lbl in Controls.OfType<Label>())
{
if (lbl.Tag.ToString() == "Mass")
{
Controls.Remove(lbl);
}
}
它将删除创建的8个标签中的5个。所有标签都有相同的标签。我必须运行相同的代码3次才能工作,每次运行时,删除的数量都会减少。很抱歉这是一个问题。
答案 0 :(得分:1)
首先,当重申另一位作者提出的问题时,链接原始帖子通常很有帮助。并将问题放在帖子和标题中。
foreach可以迭代的次数没有限制。问题是你每次迭代都会改变列表中的值的数量,所以每次删除一个值时,它都会降低完成的阈值(记住,一个&#34; foreach&#34;循环只是一个很好的打包&#34; for&#34;循环)。
这个问题有2个简单的解决方案:
解决方案1 - 创建临时副本以进行迭代
foreach (Label lbl in Controls.OfType<Label>().ToList())
{
if (lbl.Tag.ToString() == "Mass")
{
Controls.Remove(lbl);
}
}
解决方案2 - 用户更传统&#34; for&#34;循环(这需要你递减)
for(int i = 0; i < Controls.OfType<Label>().Count; i++)
{
Label lbl = Controls.OfType<Label>()[i];
if (lbl.Tag.ToString() == "Mass")
{
Controls.Remove(lbl);
i--;
}
}
我真的很惊讶你没有因尝试修改IEnumerable而获得System.InvalidOperationException。