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:字典中已存在具有相同键的元素的主要内容,如果未能解决你的问题,请参考以下文章

字典作为 ComboBox 的数据源

创建类图时出现“名称空间中已存在”消息

更新 Discord 中已存在的嵌入消息

Grails 无法保存对象,会话中已存在? [复制]

List<User> 中已存在支票或昵称

如何将新列动态添加到 bigquery 中已存在的表..?