2014-10-22 2 views
15

я получаю сообщение об ошибке с помощью следующего кода:Аргумент Exception «Пункт с тем же ключом уже был добавлен»

Dictionary<string, string> rct3Features = new Dictionary<string, string>(); 
Dictionary<string, string> rct4Features = new Dictionary<string, string>(); 

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<string, string> item in rct3Features) 
    //{ 
    // Console.WriteLine(item.Key + " " + item.Value); 
    //} 

} 

ошибка Выдает ArgumentException говоря

«Элемент с тот же ключ уже добавлен ».

Я не уверен, что после нескольких поисковых запросов Google исправить это.

Позже в коде мне нужно, чтобы получить доступ к словарю для сравнения функции:

Compare4To3(rct4Features, rct3Features); 

public static void Compare4To3(Dictionary<string, string> dictionaryOne, Dictionary<string, string> dictionaryTwo) 
{ 
    //foreach (string item in dictionaryOne) 
    //{ 

    //To print out the dictionary (to see if it works) 
    foreach (KeyValuePair<string, string> item in dictionaryOne) 
    { 
     Console.WriteLine(item.Key + " " + item.Value); 
    } 

     //if (dictionaryTwo.ContainsKey(dictionaryOne.Keys) 
     //{ 
     // Console.Write("True"); 
     //} 
     //else 
     //{ 
     // Console.Write("False"); 
     //} 
    //} 
} 

Эта функция не завершена, но я пытаюсь разрешить это исключение. Каким образом я могу исправить эту ошибку исключения и сохранить доступ к словарю для использования с этой функцией? Спасибо

+5

Остановите попытку добавить несколько элементов с тем же ключом. Возможно, вы должны добавить проверку при добавлении, чтобы убедиться, что ключ еще не существует. В противном случае мы не можем понять, каков будет правильный курс действий, поскольку вы почти не указали информацию о том, что хотите, если есть дубликаты. –

+1

Почему у вас есть дубликаты ключей? Если вам нужно больше одного значения за ключ, вы должны использовать 'Dictionary >'. –

+1

Проверьте мой ответ ниже для получения более подробной информации, но вы можете заменить свой Добавить другим синтаксисом. Следующее просто перезапишет существующее значение для ключа, если ключ уже существует: 'rct3Features [items [0]] = items [1];' –

ответ

26

Эта ошибка довольно понятна. Словарь ключей уникален, и у вас не может быть более одного ключа. Чтобы исправить это, вы должны изменить код следующим образом:

Dictionary<string, string> rct3Features = new Dictionary<string, string>(); 
Dictionary<string, string> rct4Features = new Dictionary<string, string>(); 

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<string, string> item in rct3Features) 
    //{ 
    // Console.WriteLine(item.Key + " " + item.Value); 
    //} 
} 

Это простое if заявление гарантирует, что вы только пытаетесь добавить новую запись в словаре, когда ключ (items[0]) уже не присутствует.

3

Чтобы проиллюстрировать эту проблему вы имеете, давайте посмотрим на код ...

Dictionary<string, string> test = new Dictionary<string, string>(); 

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

Причина, что словарь имеет пару ключ/значение является функцией, так что вы можете сделать это ...

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

Если у Словаря было 2 Key2, он не знал бы, какой из них следует вернуть, поэтому он ограничивает вас уникальным ключом.

1

Это исключение бросается, если в словаре уже есть ключ, когда вы пытаетесь добавить новый.

Должно быть более одной строки в rct3Lines с тем же первым словом. У вас не может быть 2 записи в одном словаре с одним и тем же ключом.

Вы должны решить, что вы хотите, чтобы произошло, если ключ уже существует - если вы хотите просто обновить значение, где ключ существует, вы можете просто

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

, но, если вы не можете проверить если ключ уже существует:

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

Как уже было сказано, вы добавляете один и тот же ключ более одного раза. Если это НЕ ВАЖНЫЙ сценарий, то проверьте ответ Jdinklage Morgoone (который сохраняет только первое значение, найденное для ключа), или рассмотрите этот способ обхода (который сохраняет только последнее значение, найденное для ключа):

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

В противном случае, если допустимо иметь несколько значений для одного ключа, вам следует подумать о сохранении ваших значений в List<string> для каждого ключа string.

Например:

var rct3Features = new Dictionary<string, List<string>>(); 
var rct4Features = new Dictionary<string, List<string>>(); 

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<string> { 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<string, List<string>> item in rct3Features) 
{ 
    Console.WriteLine("The Key: {0} has values:", item.Key); 
    foreach (string value in item.Value) 
    { 
     Console.WriteLine(" - {0}", value); 
    } 
} 
-2

Очистить словарь перед добавлением в нее элементов. Я не знаю, как словарь одного объекта влияет на чужие во время назначения, но я получил ошибку после создания другого объекта с теми же ключами, парами значений.

NB: Если вы собираетесь добавлять элементы в цикл, просто убедитесь, что вы очистили словарь перед входом в цикл.

+3

'новый словарь ()' [возвращает пустой словарь] (http://msdn.microsoft.com/en-us/library/x525za90), поэтому очистка его после постройки не требуется. Очистка его перед каждым вызовом 'Add' * * остановит исключения, но приведет к тому, что в словаре будет только последний элемент. Вы уверены, что это хорошее предложение? –

Смежные вопросы