收藏已修改;枚举操作可能无法执行。为啥? [复制]

Posted

技术标签:

【中文标题】收藏已修改;枚举操作可能无法执行。为啥? [复制]【英文标题】:Collection was modified; enumeration operation may not execute. why? [duplicate]收藏已修改;枚举操作可能无法执行。为什么? [复制] 【发布时间】:2015-09-11 22:19:48 【问题描述】:

对不起,我搜索了这个错误,但这是一个不同的情况,它对我没有帮助......

我想做一个宇宙飞船入侵游戏,我将所有子弹的列表作为 PicutreBox。

List<PictureBox> all_bullets = new List<PictureBox>();

当您按下 Space 按钮(触发按钮)时,会创建一个新项目符号,并将其添加到表单控件和列表 all_bullets 中。

当按钮从 if (_bullet.Location.Y &lt;= 0) 表单中删除时,此代码(如下)中的 _bullet 应从 all_bullets 列表中删除。

private void tmr_bullets_Tick(object sender, EventArgs e)

        foreach (PictureBox _bullet in all_bullets)
        
            _bullet.Location = new Point(_bullet.Location.X, _bullet.Location.Y - 20);

            if (_bullet.Location.Y <= 0)
              all_bullets.Remove(_bullet);  
        

        nr_bullets.Text = Convert.ToString(all_bullets.Count);

错误:

集合已修改;枚举操作可能无法执行。

对不起,如果它被重新发布,但我没有找到我需要的东西。

【问题讨论】:

您尝试删除 all_bullets 中的一个元素 进行迭代。 还有:***.com/questions/1582285/… 【参考方案1】:

枚举时不能修改集合

all_bullets.Remove(_bullet);  

这将在您枚举时修改(从集合中删除一个项目)

您可以使用 hack 来做到这一点

foreach (PictureBox _bullet in all_bullets.ToList())

【讨论】:

@doctor 非常感谢!! :) 对于您的 hack,ToArray() 也可以正常工作,同时占用资源少一些... 它会工作但it is not better,资源使用差异可以忽略。 @SimonMᶜKenzie 感谢您的链接,@dotctor。我没有考虑使用ToArray()时需要的最终重新分配。

以上是关于收藏已修改;枚举操作可能无法执行。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

收藏已修改;枚举操作可能无法执行

收藏已修改;枚举操作可能无法执行(带锁的多线程)

收藏已修改;枚举操作可能无法执行。到处都在使用锁怎么可能?

集合已修改;可能无法执行枚举操作。

C# 集合已修改;可能无法执行枚举操作

C# - 集合已修改;枚举操作可能无法执行