集合已修改;枚举操作可能无法执行.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 应用程序上使用此代码。
更改此行:
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 传递,而是生成一个新的修改后的连接并返回它。我不能给你一个例子,因为它可能涉及你的很多代码,这些代码在示例中没有显示。