Il modo più semplice è quello di fare ciò che @ IV4 suggerito:
foreach (var gem in gems.ToList())
Il ToList()
convertirà il dizionario a un elenco di KeyValuePair
, in modo da funzionare bene.
L'unica volta in cui non si vorrebbe farlo in questo modo è se si dispone di un grande dizionario da cui si rimuovono solo pochi elementi e si desidera ridurre l'uso della memoria.
Solo in questo caso sarebbe si desidera utilizzare uno dei seguenti approcci:
Fare una lista delle chiavi come li trovate, poi hanno un ciclo separato per rimuovere gli elementi:
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);
(Dove KeyType
è il tipo di chiave che si sta utilizzando. Sostituire il tipo corretto!)
in alternativa, se è importante che la gemma viene rimosso prima chiamare OnGemCollected()
, quindi (con chiave tipo TKey
e valore di tipo TValue
) fare in questo modo:
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);
}
fonte
2013-05-11 12:33:26
Prova 'foreach (var gioiello in gems.ToList())' – I4V
non è possibile rimuovere un elemento, mentre l'iterazione utilizzando foreach.use un semplice per loop.foreach non è progettato per questo –
qual è il messaggio di eccezione? – saeed