2014-09-11 3 views
0

У меня есть этот класс Form1.cs, где я создал свой графический интерфейс, он также имеет выпадающий со следующими функциональными возможностями:поиск строки в словаре

string SelectedItemName = (string)comboBox2.SelectedItem.ToString(); 
Console.WriteLine(SelectedItemName); 
if (comboBox2.SelectedIndex > -1) 
{ 
    testvariabel2.GetSessionName(); 
} 

Так что проверить, если пользователь выбрал что-то от ComboBox и я вызываю функцию GetSessionName в другом классе CTestRack.cs.

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

foreach (SectionData section in data.Sections) 
{ 
    var keyDictionary = new Dictionary<string, string>(); 
    foreach (KeyData key in section.Keys) 
     keyDictionary.Add(key.KeyName.ToString(), key.Value.ToString()); 

    newDictionary.Add(section.SectionName.ToString(), keyDictionary); 

    if (newDictionary.ContainsKey(testvariabel.SelectedItemName)) 
    { 
     Console.WriteLine("Key: {0}, Value: {1}", keyDictionary[testvariabel.SelectedItemName]); 
    } 
    else Console.WriteLine("Couldn't check Selected Name"); 
} 

Здесь я хотел бы проверить, если строка SelectedItemName существует в моем словаре, но я всегда получаю Systen.ArgumentNullException, что строка SelectedItemName в моей CTestRackClass NULL.

Теперь мой вопрос, как мне искать словарь в CTestRack для String, установленного в другом классе Form1?

+0

посмотрите на это [сообщение] (http://stackoverflow.com/a/5531058/3326331) –

ответ

1

Ну ... на самом деле, вы правильно поняли словарь! Чтобы узнать, присутствует ли ключ в словаре, вы используете ContainsKey.

if(myDictionary.ContainsKey(myKey)) 
{ 
    //do something 
} 

Однако ваши проблемы исходит из того, что нуль никогда не является допустимым ключом в словаре (в основном потому, что нуль не имеет надлежащий хэш-код). Поэтому вам нужно убедиться, что ключ, который вы ищете, не равен нулю. Из вашего кода, я думаю, что testvariabel.SelectedItemName не был установлен так, как должен.

Кроме того, существует более эффективный способ посмотреть, присутствует ли значение, прежде чем что-то делать с ним. Используйте TryGetValue:

TValue val; 
if(myDictionary.TryGetValue(myKey, out val)) 
{ 
    //do something with val 
} 

Таким образом, вам не нужно, чтобы получить доступ MyDictionary [MYKEY]. Если вы используете ContainsKey, вы фактически получаете одно и то же значение дважды. Это небольшая стоимость в большинстве случаев, но очень легко избежать, поэтому вы должны попробовать.

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

+0

Я знаю, что null не является допустимым ключом, я также записал код, как я установил переменную SelectedItemName: string SelectedItemName = (string) comboBox2.SelectedItem.ToString(); " Считаете ли вы, что это неправильно? Поскольку обычно я хотел бы сделать TryGetValue с помощью String SelectedItemName – Unlockedluca

+0

'string SelectedItemName = (string) comboBox2.SelectedItem.ToString();' не устанавливает свойство 'testvariabel.SelectedItemName', он создает новую переменную, t, похоже, используется впоследствии ... – Falanwe

0

Я вижу, что есть два четких вопроса с вашим кодом.

  1. Вы проверяете, если ключ существует в одном словаре (newDictionary), но при попытке извлечь его из другого (keyDictionary)
  2. Вы попробуйте найти ключи в словаре еще до того, он полностью построен. Переместите проверку if вне цикла foreach.
Смежные вопросы