C# 语法(2)——Encountered Problems

1.InvalidOperationException: out of sync

问题描述:

今天运行Unity遇到如下错误:
InvalidOperationException: out of sync
System.Collections.Generic.Dictionary`2+Enumerator[System.String,System.Boolean].VerifyState ()…
这里是我的源代码:

        foreach(KeyValuePair keyValue in Content.GetComponent().UserChoiceDic)
        {
            if(keyValue.Value == true)
            {
                Destroy(GameObject.Find(keyValue.Key));
                Content.GetComponent().UserChoiceDic.Remove(keyValue.Key);
            }
        }

原因如下:

foreach在迭代的时候,不能在迭代中删除正在迭代的集合,the program has no idea if it’s getting out of sync and could end up for instance in an infinite loop.事实上,即使是修改集合中的值也是不允许的。
错法一:

 foreach(var i in someList)
 {
     someList.Add(i+5);
 }

这样可能会导致重复键值或者随着元素的增加导致迭代永远无法到达最后而无限循环。
错法二:

 foreach(var i in someList)
 {
     someList.Remove(i);
 }

可能会尝试获得一个已经不存在的数据,或者,会跳过所有的偶数数据。因为当删除第一个时,原来第二个的数据会成为第一个数据,此时所删除的第二个数据会使原来的第三个数据,从而导致所有的偶数数据无法删除。

解决办法:

用List去存储键值,然后遍历List去修改相应字典中的数据。

 List keys = new List (dict.Keys);
 foreach (string key in keys) {
   dict [key] = ...

或者

 foreach (string s in dict.Keys.ToList()) {
    dict [s] = ...

注:ToList()是LINQ提供的扩展方法,需要引入Using System.Linq命名空间

参考:

https://answers.unity.com/questions/409835/out-of-sync-error-when-iterating-over-a-dictionary.html

你可能感兴趣的:(#,C#)