Как работать с вложенным словарем C#?
Dictionary<int, Dictionary<int, string>> status = new Dictionary<int, Dictionary<int, string>>();
int count = 0;
int[] li = new int[] { 6, 77, 25, 18 }; //загружаемые из БД словари
foreach (int a in li)
{
OdbcCommand command = new OdbcCommand($"select code,name from dict where parent_id={a}");
using (OdbcConnection connection = new OdbcConnection("СТРОКА ПОДКЛЮЧЕНИЯ БД"))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
using (OdbcDataReader reader = command.ExecuteReader())
{
//status.Add(count, status[count].Add(1,"2"));
}
}
count++;
}
Загружаю 4 словаря и распихиваю их в status. Я вижу это так:
{
{
0,
{
{1,"фраза"},
{2,"фраза"}
},
{
1,
{
{1,"фраза"},
{2,"фраза"}
}
}
Как правильно реализовать метод Add при такой структуре? Как получить значение без использования цикла? К примеру мне необходимо получить значение из 1 словаря 2 фразу. Гугл молчит и не дает результатов.
Ответы (1 шт):
Если я правильно понял, этот код даст желаемый результат.
var status = new Dictionary<int, Dictionary<int, string>>();
int[] li = new int[] { 6, 77, 25, 18 };
using (var command = new OdbcCommand("select code,name from dict where parent_id=?"))
using (var connection = new OdbcConnection(_connectionString))
{
command.Connection = connection;
connection.Open();
var idParam = command.Parameters.Add("id", OdbcType.Int);
for (int i = 0; i < li.Length; i++)
{
idParam.Value = li[i];
using (var reader = command.ExecuteReader())
{
var dict = new Dictionary<int, string>();
status.Add(i, dict);
while (reader.Read())
{
var code = (int)reader["code"];
var name = (string)reader["name"];
dict.Add(code, name);
}
}
}
}
Вы совершенно правильно обернули в using типы Connection и Reader. Но и Command нужно использовать аналогично.
Всегда используйте параметризованные запросы: это защитит от sql-инъекций и увеличит производительность.
Поле parent_id скорее всего имеет тип int. Если это не так, укажите правильный тип вместо OdbcType.Int.
При получении code и name из ридера тоже укажите правильные типы, если я их не угадал.
Можете использовать reader.GetInt32 и reader.GetString.