我正在开发一个简单的游戏,使用CNA的XNA库。在下面的代码片段中,我得到了收藏已被修改,其中项目未被修改
集合被修改;枚举操作可能不会执行。
错误在第二个foreach循环的顶部。在我(相对有限)的C#经验中,当在循环期间尝试修改底层集合时会发生这种情况。但是,据我所见,我不以任何方式修改enemy_positions集合。此代码中的所有集合都是List<Vector2>
类型。
这里发生了什么?
//defines collision behaviour when enemy is hit
int be_no = 0;
List<Vector2> tmp_bullets = bullet_i_position;
List<Vector2> tmp_enemy = enemy_positions;
foreach (Vector2 bullet in bullet_i_position)
{
//get bullet collision box
Rectangle bullet_col = new Rectangle(Convert.ToInt32(bullet.X - 12), Convert.ToInt32(bullet.Y - 12), 25, 26);
int en_no = 0;
foreach (Vector2 enemy in enemy_positions)
{
//get enemy collsion box
en_box = new Rectangle(Convert.ToInt32(enemy.X), Convert.ToInt32(enemy.Y), 75, 75);
if (temp_r.Intersects(en_box))
{
//remove all colliding elements
tmp_enemy.RemoveAt(en_no);
tmp_bullets.RemoveAt(be_no);
bullet_direction.RemoveAt(be_no);
}
en_no++;
}
be_no++;
}
//update actual lists
bullet_i_position = tmp_bullets;
enemy_positions = tmp_enemy;
感谢您的即时解决方案。另外关于循环的额外细节也很有意义,所以我将在未来改变我的做法(我来自PHP背景,我不必考虑循环的类型)。 –
是的,唯一需要这样做的时候是删除元素,因为当枚举时从枚举器/迭代器中删除元素时,大多数托管语言都不喜欢它。除此之外,'foreach'循环一直工作。 –
我使用的另一个解决方案是使用'ToArray'而不是创建一个新列表。 – ashes999