c# - Unity C#中嵌套字典的奇怪行为
问题描述
我在字典中使用字典。分配的最后一个键值也将存储为所有先前键的值,即使各个键分配不同。我错过了什么吗?
Dictionary<string, Dictionary <int,bool>> seenValsRounds= new Dictionary<string, Dictionary<int, bool>>();
void prepareRoundsVals()
{
Dictionary <int,bool> roundVals = new Dictionary<int, bool> ();
roundVals.Add (0,false);
seenValsRounds.Add ("A", roundVals);
seenValsRounds.Add ("B", roundVals);
seenValsRounds.Add ("C", roundVals);
seenValsRounds.Add ("D", roundVals);
seenValsRounds ["A"] [0] = false;
seenValsRounds ["B"] [0] = false;
seenValsRounds ["C"] [0] = false;
seenValsRounds ["D"] [0] = true;
foreach (KeyValuePair<string, Dictionary<int,bool>> kvp in seenValsRounds) {
Debug.Log(kvp.Key + " in round " + 0 + ": " + seenValsRounds [kvp.Key][0]);
}
}
预期结果:A 为假,B 为假,C 为假,D 为真
实际结果:A为真,B为真,C为真,D为真
根据答案和评论的建议在下面解决。每个嵌套字典也应该是“新的”:
Dictionary <int,bool> roundVals1 = new Dictionary<int, bool> ();
Dictionary <int,bool> roundVals2 = new Dictionary<int, bool> ();
Dictionary <int,bool> roundVals3 = new Dictionary<int, bool> ();
Dictionary <int,bool> roundVals4 = new Dictionary<int, bool> ();
roundVals1.Add (0,false);
roundVals2.Add (0,false);
roundVals3.Add (0,false);
roundVals4.Add (0,false);
seenValsRounds.Add ("A", roundVals1);
seenValsRounds.Add ("B", roundVals2);
seenValsRounds.Add ("C", roundVals3);
seenValsRounds.Add ("D", roundVals4);
解决方案
那是因为您在 seenValsRounds 字典中放置了对 roundVals 字典对象的相同引用。您应该为 A、B、C 和 D 创建一个新字典。
推荐阅读
- asp.net-core - 使用 JWT 令牌和策略集,我得到未经授权的 401
- php - 关于php中的sanitize和sql注入问题
- python - 根据两个列表中指定的规则创建字典字典
- javascript - 我应该在 vuex 状态下初始化哪种类型的数据以及何时初始化?
- mysql - 使用临时表的命令不同步 MySql PyQt5
- autohotkey - 对 CreateCaret 的 Autohotkey DLLcall 返回 0(函数失败)但 A_LastError 也是 0(函数成功)
- javascript - Javascript - for 循环中的计算
- python - 如何通过Rpy2(v3)在Python中使用R中的`hclust`函数?
- javascript - 如何使用 JSON 文件中的内容填充 Google Maps API InfoWindow
- r - R lm 捕获交互项,但不是分类变量