如何从嵌套字典中提取?

时间:2018-05-23 15:24:29

标签: c# dictionary

我创建了一个嵌套字典,其中包含以下内容:

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 :(得分:1)

这是你要做的基本概要:

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

正如其他人在评论中指出的那样,外部字典和文本框中的元素之间不存在一对一的关系,因为子元素中可能(可能)是多个条目。

答案 1 :(得分:1)

我会使用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();

答案 2 :(得分:1)

听起来你不需要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];

你可以得到你的名字和guid:

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

此外,由于您是通过数字索引而不是按键遍历字典,因此您可能根本不需要字典。您可能需要做的就是为Date添加Event属性,然后只有List<Event>