在foreach中删除通用列表中的项目

jop*_*aus 1 c#

我现在正在编码拾取器(硬币等),但是当你拿起东西时...它不再在地面上了.

但我得到一个例外:System.InvalidOperationException.由:引起map.Remove(),并由foreach循环引发.

那么,如何从列表中正确删除拾取器?

foreach (CollisionTiles tile in map.CollissionTiles)
{
    if (!tile.isTransparant)
        player.Collision(tile.Rectangle, map.Width, map.Height);
    else
    {
        if (player.PickUp(tile, map.Width, map.Height))
            map.Remove(tile);
    }

    camera.Update(player.Position, map.Width, map.Height);
}
Run Code Online (Sandbox Code Playgroud)

map.Remove()无效:

public void Remove(CollisionTiles tile)
{
    this.collissionTiles.Remove(tile);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

最简单的方法是记住要删除的所有元素,然后再删除它们:

var tilesToRemove = new List<CollisionTiles>();
foreach (var tile in map.CollisionTiles)
{
    if (!tile.IsTransparent)
    {
        player.Collision(tile.Rectangle, map.Width, map.Height);
    }
    else if (player.PickUp(tile, map.Width, map.Height))
    {
        tilesToRemove.Add(tile);
    }
    camera.Update(player.Position, map.Width, map.Height);
}

// Remove all the ones we didn't want
foreach (var tile in tilesToRemove)
{
    map.Remove(tile);
}
// Potentially call camera.Update here? We don't know if it uses the tiles
Run Code Online (Sandbox Code Playgroud)

(camera.Update顺便说一下,为什么你经常打电话也不清楚- 你可以在循环之后再调用一次吗?)