Как вывести мой словарь<строка, словарь <строка, строка >>?
Я действительно застрял здесь с моим выводом словаря:
У меня есть этот код для "заполнения" словаря (в основном их 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);
}
}