2013-07-23 3 views
0

Я работаю над личным проектом C#, и я хотел бы использовать вложенный словарь для обработки сохраненных значений моих параметров settings.ini для будущего чтения/записи в файле settings.ini. Мой settings.ini файл состоит из:Доступ и установка значений вложенных словарей

[Application] 
AutoShowSetting=Log 
SettingsIniDirectory=Application 
LogDirectory=Application 

...

Я использую два для каждой петли, чтобы прочитать информацию из файла settings.ini следующим образом:

public void storeIniValues() 
{ 


    int i = 0; 
    string[] sectionNames = iniFile.GetSectionNames(); 

    foreach (string section in sectionNames) 
    { 
     string[] keys = iniFile.GetKeyNames(section); 
     foreach (string key in keys) 
     {     
      string keyValue = iniFile.GetString(section, key, ""); 
      i++; 

     }   

    } 
} 

Foreach захватывает значения и помещает значения в их уважаемые строковые переменные. Я хотел бы принимать значения во время цикла через цикл foreach и помещать значения в словарь для последующего чтения/записи/обновления файла settings.ini. До сих пор я создал словарь:

static Dictionary<string, Dictionary<string, string>> iniSettings = 
    new Dictionary<string, Dictionary<string, string>>(); 

Как получить доступ к ине значения из вложенного словаря как так
iniSettings [ «Применение»] [ «AutoShowSetting»], чтобы получить соответствующее значение (в данном случае " Журнал")? Кроме того, как добавить значение к вложенному словарю, когда цикл foreach зацикливается (settingsIni [section] [key] = keyValue)? Я не знаю, с чего начать, потому что я никогда не использовал вложенный словарь.

EDIT
Я забыл упомянуть settings.ini файл будет содержать значения для заполнения флажки, текстовые поля и т.д. ...

+2

Или вы могли бы использовать совершенно тонкую структуру app.config уже присутствует для приложений C#? =) –

+0

Но теперь, когда вы уже здесь, что не так с решением, которое вы предлагаете в своем последнем абзаце? Получаете ли вы какие-либо ошибки при попытке? –

+1

Или используйте один из классов оболочки INI, как описано здесь: http://stackoverflow.com/questions/217902/reading-writing-an-ini-file – Corak

ответ

1

Предполагая, что вы хотите продолжить по этому пути, а не с помощью ConfigurationManager уже встроенный в .NET или уже существующий ini-файл-обертку, как уже упоминалось в комментариях, вам нужно сделать это, чтобы добавить значения в свою структуру в памяти:

Когда у вас есть раздел, вам нужно добавить Это.

iniSettings.Add(section, new Dictionary<string, string>()); 

Если у вас есть раздел (после его добавления), ключ и значение, вы должны добавить это.

iniSettings[section].Add(key, value); 

Это приведет к структуре, которая напоминает

+ section1 
    + key1, value 
    + key2, value 
+ section2 
    + key1, value 

и т.д. Вы можете проверить, если раздел существует в вашей структуре в-памяти, вызвав

bool sectionExists = iniSettings.ContainsKey(section); 

, который будет возвращать BOOL. То же самое касается клавиш, конечно:

bool keyExists = iniSettings[section].ContainsKey(key); 

Чтобы получить к ним доступ, вы просто использовать то, что вы уже придумали:

var value = iniSettings[section][key]; 
+1

Простите первый абзац, судящий, я просто хотел дать понять, что есть альтернативы. =) –

+0

Мне любопытно, если я смогу пойти еще один словарь глубоко. такие как: статический словарь <строка, словарь <словарь <строка, строка>, строка >> iniSettings = новый словарь <строка, словарь <словарь <строка, строка>, строка >>(); iniSettings.Add (раздел, новый словарь <словарь <строка, строка>, строка>()); ' Если это возможно, как мне добавить во вложенный словарь? – dottedquad

+0

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

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