【问题标题】:How do i extract from a nested dictionary?如何从嵌套字典中提取?
【发布时间】:2018-05-23 15:24:29
【问题描述】:

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

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 部分是我陷入如何从嵌套字典中提取值的问题,因此这部分代码是错误/不完整的。

我不能使用元组,因为我使用的是低于 4 的 .NET,并且似乎无法将我的头脑围绕着制作一个自定义类来充当它自己的元组或多字典。

【问题讨论】:

  • dateDict[keyVar] 会给您Dictionary&lt;string,string&gt;,但是您想如何将其转换为单个string?您可以使用string.Join(";", dataDict[keyVar].Select(kvp =&gt; kvp.Key + "=" + kvp.Value) 来获取以分号分隔的“key=value”对字符串。
  • @juharr 我只是想从嵌套字典中获取键或值,而不是同时获取两者。我存储 3 个东西,日期时间、字符串(名称)和字符串(GUID),它们是数据库值
  • 什么是eventDateBoxes?如果每个日期有多个事件,您希望如何格式化文本?
  • @TimSchmelter eventDateBoxes 是一个列表
  • 如果您只需要一个 DateTime 来配对字符串,那么要么使用 Tuple&lt;string, string&gt; 或像 class MyClass { public string Thing1{get;set;} public string Thing2 {get;set;}} 这样的自定义类,不要使用嵌套的 Dictionary

标签: c# dictionary


【解决方案1】:

听起来您不需要Dictionary&lt;DateTime, Dictionary&lt;string, string&gt;&gt;,因为您的内部字典中只有一个项目,您需要一个Dictionary&lt;DateTime, Dictionary&lt;string, Event&gt;&gt;,其中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&lt;Event&gt;

【讨论】:

  • 辛苦了!被困在 id 如何从类中调用值而不为它们分配名称,意识到我在尝试后不需要这样做,非常感谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是你要做什么的基本大纲:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 2021-11-09
      • 2018-04-20
      • 2020-01-21
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多