如何在C#中迭代Collection时添加或删除对象

Hak*_*sai 12 c# collections

我在迭代Collection时尝试删除对象.但我得到例外.我怎样才能做到这一点?这是我的代码:

foreach (var gem in gems)
{
    gem.Value.Update(gameTime);

    if (gem.Value.BoundingCircle.Intersects(Player.BoundingRectangle))
    {
       gems.Remove(gem.Key); // I can't do this here, then How can I do?
       OnGemCollected(gem.Value, Player);
    }
}
Run Code Online (Sandbox Code Playgroud)

gra*_*noz 23

foreach设计用于迭代集合而不修改它.

要在迭代时从集合中删除项目,请使用从结尾到开头的for循环.

for(int i = gems.Count - 1; i >=0 ; i--)
{
  gems[i].Value.Update(gameTime);

  if (gems[i].Value.BoundingCircle.Intersects(Player.BoundingRectangle))
  {
      Gem gem = gems[i];
      gems.RemoveAt(i); // Assuming it's a List<Gem>
      OnGemCollected(gem.Value, Player);
  }
 }
Run Code Online (Sandbox Code Playgroud)

dictionary<string, Gem>例如,如果是,你可以像这样迭代:

foreach(string s in gems.Keys.ToList())
{
   if(gems[s].BoundingCircle.Intersects(Player.BoundingRectangle))
   {
     gems.Remove(s);
   }
}
Run Code Online (Sandbox Code Playgroud)