Как вывести мой словарь<строка, словарь <строка, строка >>?

Я действительно застрял здесь с моим выводом словаря:

У меня есть этот код для "заполнения" словаря (в основном их 2):

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

Form1 _form1Object = new Form1();

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);
}

Это работает довольно хорошо, но теперь я хотел бы найти его. Это означает, что у меня есть строка, в которой хранится "выделение" из "списка" в Form1.class.

Теперь я хочу найти эту строку в моем словаре, для этого у меня есть следующее:

while (_form1Object.comboBox2.SelectedIndex > -1)
{
     _form1Object.SelectedItemName = _form1Object.comboBox2.SelectedItem.ToString();

     if (newDictionary.ContainsKey(_form1Object.SelectedItemName))
     {
         Console.WriteLine("Key: {0}, Value: {1}", newDictionary[_form1Object.SelectedItemName]);
         Console.WriteLine("Dictionary includes 'SelectedItem' but there is no output");
     }
     else Console.WriteLine("Couldn't check Selected Name");
}

Но, да, вы правы, это не работает, вывод в консоли:

System.Collections.Generic.Dictionary`2[System.String,System.String]

И я даже не понимаю Console.WriteLine("Couln't check selected Name") Это означает, что он будет выполняться через оператор IF, но функция Console.WriteLine не работает.

Теперь мой вопрос, как мне найти мое String SelectedItemName в Dictionary<string, Dictionary<string,string>>?

3 ответа

Решение

Вы должны будете реализовать свою собственную логику вывода. Dictionary<TKey, TValue> не переопределяет Object.ToString поэтому вывод - это просто имя класса. Что-то вроде:

public static class DictionaryExtensions
{ 
  public static string WriteContent(this Dictionary<string, string> source)
  {
    var sb = new StringBuilder();
    foreach (var kvp in source) {
      sb.AddLine("Key: {0} Value: {1}", kvp.Key, kvp.Value);
    }
    return sb.ToString();
  }
}

Позволит вам просто позвонить .WriteContent() на newDictionary[_form1object.SelectedItemName] когда на это пространство имен ссылаются.

Вам нужно что-то похожее на:

foreach (var keyValue in newDictionary[_form1Object.SelectedItemName])
{
   Console.WriteLine("Key: {0}, Value: {1}", keyValue.Key, keyValue.Value);
}

Это работает так, как должно работать. Смотри, ты получаешь это выражение

newDictionary[_form1Object.SelectedItemName]

где newDictionary имеет строковый ключ и другой словарь в качестве значения. Так что это выражение вернет вам value поле родительского словаря, который на самом деле dictionary,

Это означает, что вы также должны перебирать свой дочерний словарь, как это

 if (newDictionary.ContainsKey(_form1Object.SelectedItemName))
 {
     Console.WriteLine("Parent Key : {0}",_form1Object.SelectedItemName)
     foreach(var childDict in newDictionary[_form1Object.SelectedItemName])
     {
        Console.WriteLine("Key: {0}, Value: {1}", childDict.Key,childDict.Value);
     }
 }
Другие вопросы по тегам