最も簡単な方法は、@ IV4 が提案したことを行うことです。
foreach (var gem in gems.ToList())
は Dictionary をのToList()
リストに変換するKeyValuePair
ので、問題なく動作します。
そのようにしたくないのは、比較的少数のアイテムのみを削除する大きな辞書があり、メモリの使用を減らしたい場合だけです。
その場合にのみ、次のいずれかのアプローチを使用します。
見つかったキーのリストを作成し、別のループでアイテムを削除します。
List<KeyType> keysToRemove = new List<KeyType>();
foreach (var gem in gems)
{
gem.Value.Update(gameTime);
if (gem.Value.BoundingCircle.Intersects(Player.BoundingRectangle))
{
OnGemCollected(gem.Value, Player);
keysToRemove.Add(gem.Key);
}
}
foreach (var key in keysToRemove)
gems.Remove(key);
(使用しているキーのタイプはどこKeyType
にありますか。正しいタイプに置き換えてください!)
または、を呼び出す前にgem を削除することが重要な場合はOnGemCollected()
、(キーの typeTKey
と値の type を使用TValue
して) 次のようにします。
var itemsToRemove = new List<KeyValuePair<TKey, TValue>>();
foreach (var gem in gems)
{
gem.Value.Update(gameTime);
if (gem.Value.BoundingCircle.Intersects(Player.BoundingRectangle))
itemsToRemove.Add(gem);
}
foreach (var item in itemsToRemove)
{
gems.Remove(item.Key);
OnGemCollected(item.Value, Player);
}