集合已修改;枚举操作可能无法执行.IEnumerator MoveNext()

本文关键字:执行 IEnumerator MoveNext 修改 枚举 操作 集合 | 更新日期: 2023-09-27 18:32:44

我收到此错误 集合已修改;枚举操作可能无法执行。 在方法上。对于下面的方法,我需要 2 个参数,其中一个是通过引用传递的,我需要在枚举它时更改它。我知道这就是我收到此错误的问题,我的问题是如何修改我的方法?我一直在看同一个问题,但我不知道如何解决我的问题。

public class NeuronConnections : Dictionary<object,object>
    {
        public NeuronConnections() { }
        public ICollection Neurons()
        {
            return base.Keys;
        }
    }
public virtual void UpdateWeights(ref NeuronConnections connections, double delta)
{
    IEnumerator enumerator = null;
    try
    {
        try
        {
            enumerator = connections.Neurons().GetEnumerator();
            while (enumerator.MoveNext())
            {
                if(enumerator == null)
                {
                    continue;
                }
                INeuron current = (INeuron)enumerator.Current;
                if (current == null)
                {
                    continue;
                }
                connections[current] = Convert.ToDouble(connections[current]) + 0.5 * current.Output * delta;
            }
        }
        finally
        {
            if (enumerator is IDisposable)
            {
                ((IDisposable)enumerator).Dispose();
            }
        }
    }
    catch (Exception e)
    {
        Debug.WriteLine("UpdateWeights:'n{0}", e.Message);
    }
}

我在 Windows Phone 应用程序上使用此代码。

集合已修改;枚举操作可能无法执行.IEnumerator MoveNext()

更改此行:

enumerator = connections.Neurons().GetEnumerator();

enumerator = connections.Neurons().ToList().GetEnumerator();

关键是 - 具体化您的收藏。这样您就不会编辑要迭代的集合

这就是编译器不满意的地方......你修改了正在迭代的集合。

您似乎想就地修改集合。所以你应该用这个替换你的内部尝试块:

var neurons = connections.Neurons().ToArray();
for (int i=0; i<neurons.Length; i++) {
    INeuron current = neurons[i];
    if (current == null) continue;
    connections[current] = Convert.ToDouble(connections[current]) + 0.5 * current.Output * delta;
}

另一个更干净的选择是不将初始连接作为 ref 传递,而是生成一个新的修改后的连接并返回它。我不能给你一个例子,因为它可能涉及你的很多代码,这些代码在示例中没有显示。