参数exception“已添加具有相同密钥的项目”

我一直收到以下代码的错误:

Dictionary rct3Features = new Dictionary(); Dictionary rct4Features = new Dictionary(); foreach (string line in rct3Lines) { string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); rct3Features.Add(items[0], items[1]); ////To print out the dictionary (to see if it works) //foreach (KeyValuePair item in rct3Features) //{ // Console.WriteLine(item.Key + " " + item.Value); //} } 

该错误抛出ArgumentException

“已经添加了具有相同键的项目。”

经过几次谷歌搜索,我不确定如何解决这个问题。

稍后在代码中我需要访问字典以获得比较函数:

 Compare4To3(rct4Features, rct3Features); public static void Compare4To3(Dictionary dictionaryOne, Dictionary dictionaryTwo) { //foreach (string item in dictionaryOne) //{ //To print out the dictionary (to see if it works) foreach (KeyValuePair item in dictionaryOne) { Console.WriteLine(item.Key + " " + item.Value); } //if (dictionaryTwo.ContainsKey(dictionaryOne.Keys) //{ // Console.Write("True"); //} //else //{ // Console.Write("False"); //} //} } 

此function尚未完成,但我正在尝试解决此exception。 有什么方法可以解决这个exception错误,并保持对该函数使用的字典的访问权限? 谢谢

这个错误是相当不言自明的。 字典键是唯一的,您不能有多个相同的键。 要解决此问题,您应该修改代码,如下所示:

 Dictionary rct3Features = new Dictionary(); Dictionary rct4Features = new Dictionary(); foreach (string line in rct3Lines) { string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); if (!rct3Features.ContainsKey(items[0])) { rct3Features.Add(items[0], items[1]); } ////To print out the dictionary (to see if it works) //foreach (KeyValuePair item in rct3Features) //{ // Console.WriteLine(item.Key + " " + item.Value); //} } 

这个简单的if语句确保当Key( items[0] )尚不存在时,您只是尝试向Dictionary添加新条目。

正如其他人所说,你不止一次地添加相同的密钥。 如果这不是一个有效的场景,那么检查Jdinklage Morgoone的答案(只保存为键找到的第一个值),或者,考虑这个解决方法(只保存为键找到的最后一个值):

 // This will always overwrite the existing value if one is already stored for this key rct3Features[items[0]] = items[1]; 

否则,如果单个键有多个值是有效的,那么您应该考虑将值存储在每个string键的List中。

例如:

 var rct3Features = new Dictionary>(); var rct4Features = new Dictionary>(); foreach (string line in rct3Lines) { string[] items = line.Split(new String[] { " " }, 2, StringSplitOptions.None); if (!rct3Features.ContainsKey(items[0])) { // No items for this key have been added, so create a new list // for the value with item[1] as the only item in the list rct3Features.Add(items[0], new List { items[1] }); } else { // This key already exists, so add item[1] to the existing list value rct3Features[items[0]].Add(items[1]); } } // To display your keys and values (testing) foreach (KeyValuePair> item in rct3Features) { Console.WriteLine("The Key: {0} has values:", item.Key); foreach (string value in item.Value) { Console.WriteLine(" - {0}", value); } } 

为了说明你遇到的问题,让我们看看一些代码……

 Dictionary test = new Dictionary(); test.Add("Key1", "Value1"); // Works fine test.Add("Key2", "Value2"); // Works fine test.Add("Key1", "Value3"); // Fails because of duplicate key 

字典具有键/值对的原因是一个function,所以你可以这样做…

 var myString = test["Key2"]; // myString is now Value2. 

如果Dictionary有2个Key2,它就不知道要返回哪一个,所以它限制你使用一个唯一的键。

如果在尝试添加新密钥时字典中已存在密钥,则抛出exception。

rct3Lines必须有多行具有相同的第一个单词。 您不能在相同的字典中使用相同的键具有2个条目。

如果密钥已经存在,您需要决定要发生什么 – 如果您只想更新密钥存在的值,您可以简单地

 rct3Features[items[0]]=items[1] 

但是,如果不是,您可能想测试密钥是否已存在:

 if(rect3Features.ContainsKey(items[0])) { //Do something } else { //Do something else } 

在向其添加任何项目之前清除字典。 我不知道在分配期间一个对象的字典如何影响另一个对象,但是在创建具有相同键值对的另一个对象后我得到了错误。

注意:如果要在循环中添加项目,请确保在进入循环之前清除字典。