ArgumentException:字典中已存在具有相同键的元素
Posted
技术标签:
【中文标题】ArgumentException:字典中已存在具有相同键的元素【英文标题】:ArgumentException: An element with the same key already exists in the dictionary 【发布时间】:2018-04-08 08:18:34 【问题描述】:在我的项目中,我有两个场景'Opening''Main'。
如果一段时间内没有按键或完成任务, 它会回到开场场景并重新开始。
它有效,开始场景 -> 主场景 并转到主场景 -> 开幕场景
但是“主场景 -> 开场”以及当我再次尝试进入主场景时, 它显示了这些错误。 :
ArgumentException: An element with the same key already exists in the dictionary.
System.Collections.Generic.Dictionary`2[System.Int32,System.Collections.Generic.Dictionary`2[KeyDelayData+Delay,UnityEngine.Sprite]].Add (Int32 key, System.Collections.Generic.Dictionary`2 value) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:404)
Note.Init () (at Assets/Scripts/Music/Note.cs:22)
ManagerChat.Awake () (at Assets/Scripts/Chatting/ManagerChat.cs:315)
ArgumentException: An element with the same key already exists in the dictionary.
System.Collections.Generic.Dictionary`2[System.Int32,UnityEngine.AudioClip].Add (Int32 key, UnityEngine.AudioClip value) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:404)
SoundManager.Awake () (at Assets/Scripts/Music/SoundManager.cs:16)
这对我来说似乎是一些重置变量的问题,但我不知道这是什么意思 我能做些什么来解决这个问题?
【问题讨论】:
你在使用Dictionary
吗?如果没有,那么您正在使用的插件在尝试再次添加现有密钥时正在使用字典。
是的,我在几个脚本上使用 Dictionary。
我使用 DictionaryValue.Clear (); 修复第二个但我仍然无法修复第一个
我通过像第二个一样简单地清除值来修复第一个,谢谢!
【参考方案1】:
您正在尝试将现有密钥添加到 Dictionary
。
来自ManagerChat
脚本的Awake
函数中的第一个错误315。
Awake
函数中的第二个错误来自 16 行上的 SoundManager
脚本。
解决方案:
1.Dictionary.Clear()
应该这样做,但如果您不想清除它们,请在使用 Dictionary.Add
函数添加之前检查密钥是否已经在 Dictionary
中:
假设这是您的代码:
Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
imageDict.Add(keyToAdd, new Sprite());
改成:
Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
//Add only if key does not exist
if (!imageDict.ContainsKey(keyToAdd))
imageDict.Add(keyToAdd, new Sprite());
2。另一种方法是使用索引([]
)作为更改它的键。这不涉及Dictionary.Add
函数。
Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
imageDict.Add(keyToAdd, new Sprite());
应该是:
Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
imageDict[keyToAdd] = new Sprite();
【讨论】:
感谢您以更聪明的方式接近!好多了!【参考方案2】:我使用 DictionaryValue.Clear ();
我认为是关于剩下的对象和精灵。
【讨论】:
对我来说是一种快捷方式,但它也适用于我的项目! 应该可以。这取决于您是否要清除字典。不客气!以上是关于ArgumentException:字典中已存在具有相同键的元素的主要内容,如果未能解决你的问题,请参考以下文章