Как извлечь из вложенного словаря? - PullRequest
0 голосов
/ 23 мая 2018

Я создал вложенный словарь со следующим:

Dictionary<DateTime, Dictionary<string, string>> dateDict =
    new Dictionary<DateTime, Dictionary<string, string>>();

Затем я ввожу значения в этот словарь, используя следующее:

while (reader.Read())
{
    DateTime date = DateTime.Parse(reader["Event_Date"].ToString());
    string name = reader["Event_Name"].ToString();
    string guid = reader["Event_GUID"].ToString();
    dateDict.Add(date, new Dictionary<string, string>());
    dateDict[date].Add(name, guid);
}

У меня вопрос, как правильно вытащитьпеременные возвращаются из вложенного словаря?

У меня есть этот цикл, выполняющий извлечение значений и присваивание их DateTimePickers и TextFields:

for (int i = 0; i < dateDict.Count; i++)
{
    DateTime keyVar = dateDict.ElementAt(i).Key;
    eventDateBoxes[i].Value = keyVar;
    eventTextBoxes[i].Text = dateDict[keyVar[]];
}

Часть eventTextBoxes - это то место, где я застреваюкак извлечь значение из вложенного словаря, следовательно, почему эта часть кода неверна / неполна.

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

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Я бы использовал foreach или запрос LINQ.Но не понятно, что вы хотите, как DateTimePicker.Text:

List<DateTimePicker> eventDateBoxes = dateDict
    .Select(kv => new{ 
       Date = kv.Key, 
       EventName = kv.Value["Event_Name"],
       EventGuid = kv.Value["Event_GUID"],
    })
    .Select(x => new DateTimePicker{ Value = x.Date, Text = x.EventName })
    .ToList();
0 голосов
/ 23 мая 2018

Похоже, вам не нужен Dictionary<DateTime, Dictionary<string, string>>, поскольку у вас есть только один элемент во внутреннем словаре, вам нужен Dictionary<DateTime, Dictionary<string, Event>>, где Event - это класс, который содержит данные о ваших событиях.Что-то вроде:

public class Event
{
    public string Name {get; set;}
    public string Guid {get; set;}  // you could actually use the GUID type here!
}

Затем вы должны заполнить его следующим образом:

while (reader.Read())
{
    DateTime date = DateTime.Parse(reader["Event_Date"].ToString());
    string name = reader["Event_Name"].ToString();
    string guid = reader["Event_GUID"].ToString();
    dateDict.Add(date, new Event() { Name = name, Guid = guid };
}

Затем, когда вы получите элемент из словаря по ключу:

var item = dateDict[someKey];

Вы можете получить свое имя и подсказку:

var name = item.Name;
var guid = item.guid;

Кроме того, поскольку вы выполняете итерацию по своему словарю по числовому индексу, а не по ключу, кажется, что вам, вероятно, словарь вообще не нужен.Может быть, все, что вам нужно сделать, это добавить свойство Date к вашему Event и просто иметь List<Event>.

0 голосов
/ 23 мая 2018

Это основная схема того, что вы будете делать:

foreach (var element in dateDict)
{
    eventDateBoxes[i].Value = element.Key;
    foreach (var subElement in element.Value)
    {
        eventTextBoxes[i].Text = subElement.Value;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...