【问题标题】:Is there a limit for this?这有限制吗?
【发布时间】:2017-12-23 04:36:16
【问题描述】:

好的,所以我不允许对我发现的要问这个问题的作者的帖子发表评论,所以希望 Sergey(对不起,如果我拼写错误)能看到这个。我有 8 个动态制作的标签控件,当我使用他提供的代码时:

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

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

【问题讨论】:

  • 不,没有限制(在合理范围内),只有当您开始进行大量更新时才会影响性能。
  • 有什么限制吗?你的 8 个标签?
  • 不清楚你在问什么。请为有意义的标题和正文付出一些努力
  • 您应该包括标签的创建方式、地点和时间。您可能对标签创建到删除之间的事件顺序有疑问。
  • 对了,你正在开发 ASP.NET Webform,对吧?您应该标记您正在执行的应用程序类型。

标签: c# controls


【解决方案1】:

首先,在重复其他作者的问题时,链接原始帖子通常会有所帮助。并将问题和标题放在帖子中。

foreach 可以迭代的次数没有限制。问题是您每次迭代都会更改列表中的值的数量,因此每次删除一个值时,它都会降低完成的阈值(请记住,“foreach”循环只是一个包装精美的“for”循环)。

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

解决方案 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--;
        }
    }

我真的很惊讶你没有因为尝试修改 IEnumerable 而收到 System.InvalidOperationException。

【讨论】:

  • 好吧,是的,对不起,我很讨厌发帖,尽量不要使用 Stackoverflow,这通常会导致,是的。谢谢你,再次抱歉
  • 解决方案 2 无效。 OfType&lt;T&gt; 返回一个 IEnumerable&lt;T&gt;,这意味着 A. 没有 Count property 和 B. 没有索引器。为了匹配你所拥有的,你必须用 Count()ElementAt(int) 替换,然后必须继续重复整个集合。您可以通过将OfType&lt;Label&gt;().ToList()(或ToArray())的结果存储在之前迭代的临时变量中来修复这两个问题。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2011-11-19
  • 2021-07-17
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多