【问题标题】:Initialising a new Dictionary with a List of keys使用键列表初始化新字典
【发布时间】:2019-06-17 09:54:52
【问题描述】:

我正在初始化一个新的字典,并像这样一一放置每个键:

igData = data.Select(x => new Dictionary<string, string> {
                     ["Date"] = x.GetValueOrDefault("DATE"),
                     ["SP"] = x.GetValueOrDefault("SP"),
                     ["IG"] = x.GetValueOrDefault("IG")}).ToList();

这很好,但其余的键需要是我在 List&lt;string&gt; headers 中创建的标题

是否可以在上面的初始化中添加此标头列表?像这样的:

igData = data.Select(x => new Dictionary<string, string> {
     ["Date"] = x.GetValueOrDefault("DATE"),
     ["SP"] = x.GetValueOrDefault("SP"),
     ["IG"] = x.GetValueOrDefault("IG"),
     headers.Select(y => new KeyValuePair<string, string>
                                             (y, x.GetValueOrDefault["IG"])).ToList();

我知道值是相同的,但这是有意的。以上是可能的还是我会分开的。最好在上面执行此操作,因为我可以访问 data 集合中的值。

【问题讨论】:

  • data/headers的类型是什么?为什么要创建这么多字典?
  • 您应该使用ToDictionary 扩展名。
  • @ChengChen 数据是List&lt;Dictionary&lt;string, string&gt;&gt;,标题是List&lt;string&gt;
  • 如果你想要一个 KeyValuePair 的列表,那么使用 List> 而不是字典。然后,您可以选择使用 AddRange() 一次添加多个项目,而字典只有 Add()。
  • 字典的集合总是让我觉得-uaaah,是的-不舒服。它们往往会出人意料地增长,因此变得越来越不可维护,尤其是当您的数据结构变得更加复杂时。相反,您应该考虑使用属性创建一个类。

标签: c# linq dictionary


【解决方案1】:

你不能在这样的初始化程序中做到这一点,但我建议你可以用一点 ConcatToDictionary 做到这一点:

igData = data.Select(x => {
   return new KeyValuePair<string,string>[]{
          new KeyValuePair<string,string>("Date", x.GetValueOrDefault("DATE")),
          new KeyValuePair<string,string>("SP", x.GetValueOrDefault("SP")),
          new KeyValuePair<string,string>("IG", x.GetValueOrDefault("IG"))
       }.Concat(
          headers.GetHalfHourlyTimeHeaders().Select(y => new KeyValuePair<string, string>
                                             (y, x.GetValueOrDefault["IG"])).ToList()
       ).ToDictionary(k => k.Key, v => v.Value);
});

【讨论】:

  • 您创建一个 KVP 数组而不是仅仅初始化一个新字典并添加到其中有什么原因?只是想更好地理解代码。
  • 不是真的,只是这样我可以将它们与您的 GetHalfHourlyTimeHeaders 链接 (.Concat) 并创建一个字典。
  • 哦,好吧,所以直接添加到字典中不适用于 Concat?
  • 它可能会,字典只是IEnumerable&lt;KeyValuePair&lt;&gt;&gt; - 问题是,是否需要另一个字典的开销。
  • 好的,有道理。谢谢!
【解决方案2】:
igData = data.Select(x =>
    new Dictionary<string, string>(headers.GetHalfHourlyTimeHeaders().ToDictionary(y => y, y => x.GetValueOrDefault("IG")))
    {
        ["Date"] = x.GetValueOrDefault("DATE"),
        ["SP"] = x.GetValueOrDefault("SP"),
        ["IG"] = x.GetValueOrDefault("IG")
    });

查询语法对我来说看起来更好

igData = from x in data
         let ig = x.GetValueOrDefault("IG")
         select new Dictionary<string, string>(headers.GetHalfHourlyTimeHeaders().ToDictionary(y => y, y => ig))
         {
             ["Date"] = x.GetValueOrDefault("DATE"),
             ["SP"] = x.GetValueOrDefault("SP"),
             ["IG"] = ig
         };

【讨论】:

    【解决方案3】:

    类似于 Jamiec 的回答,但在我看来更具可读性(但未经性能测试):

    List<Dictionary<string, string>> igData = data.Select(x => 
        {
            var dict = new Dictionary<string, string>
            {
                ["Date"] = x.GetValueOrDefault("DATE"),
                ["SP"] = x.GetValueOrDefault("SP"),
                ["IG"] = x.GetValueOrDefault("IG")
            };
    
            // I hope I understand correctly that GetHalfHourlyTimeHeaders returns List<string>
            foreach (string header in headers.GetHalfHourlyTimeHeaders())
            {
                dict.Add(header, x.GetValueOrDefault("IG"));
            }
    
            return dict;
        }
    ).ToList();
    

    【讨论】:

      【解决方案4】:

      我喜欢这种方式:

      igData =
          data
              .Select(x =>
                  Enumerable
                      .Concat(
                          headers
                              .GetHalfHourlyTimeHeaders()
                              .Select(k => new { k, v = x.GetValueOrDefault("IG") }),
                          new [] { "Date", "SP", "IG" }
                              .Select(k => new { k, v = x.GetValueOrDefault(k.ToUpper()) }))
                      .ToDictionary(z => z.k, z => z.v))
              .ToList();
      

      【讨论】:

      • 这不起作用,因为它没有从 data 集合中获取值。
      • @UsmanKhan - 对不起,你是对的。我错过了查询的那部分。我已经修好了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 2016-02-14
      • 2021-02-09
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多