【问题标题】:Converting a LINQ query into a Dictionary<string, string[]>将 LINQ 查询转换为 Dictionary<string, string[]>
【发布时间】:2013-07-01 14:28:21
【问题描述】:

我有一个返回以下格式的查询:

{ "tesla", "model s" }
{ "tesla", "roadster" }
{ "honda", "civic" }
{ "honda", "accord" }

我想将其转换为 &lt;string, string[]&gt; 的字典,如下所示:

{ "tesla" : ["model s", "roadster"],  "honda" : ["civic", "accord"] }

我试过这个:

var result = query.Select(q => new { q.Manufacturer, q.Car}).Distinct().ToDictionary(q => q.Manufacturer.ToString(), q => q.Car.ToArray()); 

但到目前为止,我没有任何运气。我认为这实际上是在尝试添加诸如 "tesla" : ["model s"]"tesla" : ["roadster"] 之类的单个项目,这就是它失败的原因......有什么简单的方法可以完成我在 LINQ 中尝试做的事情吗?

【问题讨论】:

标签: c# .net string linq dictionary


【解决方案1】:

您需要先按键对每个项目进行分组,然后构造字典:

result = query.Select(q => new { q.Manufacturer, q.Car}).Distinct()
              .GroupBy(q => q.Manufacturer)
              .ToDictionary(g => g.Key, 
                            g => g.Select(q => q.Car).ToArray());

当然,ILookup&lt;string, string&gt; 更容易:

result = query.Select(q => new { q.Manufacturer, q.Car }).Distinct()
              .ToLookup(q => q.Manufacturer, q => q.Car);

【讨论】:

  • 优秀。谢谢。这正是我所需要的。
【解决方案2】:

如果您希望将结果分组到类似字典的对象中,您正在寻找 ToLookup

var result = query.Select(q => new { q.Manufacturer, q.Car})
                  .Distinct()
                  .ToLookup(q => q.Manufacturer.ToString(), q => q.Car);

否则您必须先对结果进行分组:

var result = query.Select(q => new { q.Manufacturer, q.Car })
                  .Distinct()
                  .GroupBy(q => q.Manufacturer)
                  .ToDictionary(gg => gg.Key,
                                gg => gg.Select(q => q.Car).ToArray());

【讨论】:

    【解决方案3】:

    你想要的是GroupBy(),然后是ToDictionary()

    例子:

    var result = query.GroupBy(q => q.Manufacturer).ToDictionary(q => q.Key, q => q.Value.ToArray());
    

    GroupBy() 所做的是将具有相同匹配键选择器的所有元素分组。所以当你告诉GroupBy(q =&gt; q.Manufacturer)时,所有具有相同制造商的元素都会被归为IEnumerable&lt;T&gt;

    【讨论】:

      【解决方案4】:

      使用ToLookup:

      var table = pairs.ToLookup(kvp => kvp.Key, kvp => kvp.Value);
      
      foreach(var i in table["tesla"])
         Console.WriteLine(i);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多