这有限制吗?

问题描述 投票:-3回答:1

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

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

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

c# controls
1个回答
1
投票

首先,当重申另一位作者提出的问题时,链接原始帖子通常很有帮助。并将问题放在帖子和标题中。

foreach可以迭代的次数没有限制。问题是你每次迭代都要改变列表中的值的数量,所以每次删除一个值时,它都会降低完成的阈值(记住,“foreach”循环只是一个很好的打包“for”循环)。

这个问题有2个简单的解决方案:

解决方案1 ​​ - 创建临时副本以进行迭代

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

解决方案2 - 用户使用更传统的“for”循环(这需要您减少)

    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--;
        }
    }

我真的很惊讶你没有得到System.InvalidOperationException试图修改IEnumerable。

© www.soinside.com 2019 - 2024. All rights reserved.