这有限制吗?

时间:2017-12-23 04:36:16

标签: c# controls

好吧,所以我没有被允许对这个帖子发表评论,我发现问这个问题的作者,所以希望谢尔盖(对不起,如果我拼错了)看到这个。我有8个Label控件是动态制作的,当我使用他提供的代码时:

            foreach (Label lbl in Controls.OfType<Label>())
        {
            if (lbl.Tag.ToString() == "Mass")
            {
                Controls.Remove(lbl);
            }
        }

它将删除创建的8个标签中的5个。所有标签都有相同的标签。我必须运行相同的代码3次才能工作,每次运行时,删除的数量都会减少。很抱歉这是一个问题。

1 个答案:

答案 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。