C# - 在foreach中更改字典键值对的值

Jam*_*mes 9 c# collections foreach dictionary enumeration

我有这个代码在游戏的每一帧运行:

    foreach (var repeaterAction in conditionTimes.Keys)
    {
        if (repeaterAction.Condition() == true)
        {
            if (conditionTimes[repeaterAction] == TimeSpan.Zero)
            {
                repeaterAction.Action();
            }
            else if (conditionTimes[repeaterAction] >= repeaterAction.InitialLapse)
            {
                repeaterAction.Action();
                conditionTimes[repeaterAction] -= repeaterAction.ActionInterval;
            }
            conditionTimes[repeaterAction] += gameTime.ElapsedGameTime;
        }
        else
        {
            conditionTimes[repeaterAction] = TimeSpan.Zero;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

收集被修改; 枚举操作可能无法执行.

有没有办法修改foreach循环中键值对中的值,而不是每帧都复制Dictionary?

ntz*_*lis 13

我建议不要尝试修改集合,同时使用字典循环它,但是由于可以直接访问密钥,因此可以实现.只需在.ToArray()之后添加conditionTimes.Keys,foreach然后键成为一个单独的集合,您可以修改字典:

foreach (var repeaterAction in conditionTimes.Keys.ToArray())
{
    if (repeaterAction.Condition() == true)
    {
        if (conditionTimes[repeaterAction] == TimeSpan.Zero)
        {
            repeaterAction.Action();
        }
        else if (conditionTimes[repeaterAction] >= repeaterAction.InitialLapse)
        {
            repeaterAction.Action();
            conditionTimes[repeaterAction] -= repeaterAction.ActionInterval;
        }
        conditionTimes[repeaterAction] += gameTime.ElapsedGameTime;
    }
    else
    {
        conditionTimes[repeaterAction] = TimeSpan.Zero;
    }
}
Run Code Online (Sandbox Code Playgroud)

您还必须修改您的代码,以便在密钥更改时实际从字典中删除条目并添加新条目,因为密钥实际上无法更改,只需删除即可.
同样不建议这样做.


Sim*_*one 0

抱歉,你不能。

我想你最好的选择是创建一个新的字典,然后在完成循环后将其与旧的字典交换foreach