将LINQ查询转换为Dictionary<string, string[]>

5
我有一个查询,返回以下格式的内容:
{ "tesla", "model s" }
{ "tesla", "roadster" }
{ "honda", "civic" }
{ "honda", "accord" }

我希望将其转换为一个 <string, string[]> 字典,如下所示:
{ "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中实现我想要做的事情?


可能是 https://dev59.com/0Gw05IYBdhLWcg3wSABH 的重复问题。 - feralin
4个回答

3
你需要先按照键将每个项目分组,然后构建字典:
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<string, string>要简单得多:

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

3

如果您希望结果被分组成类似字典的对象,则应使用 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());

1
你需要的是使用 GroupBy() 然后接着使用 ToDictionary()

例如:

var result = query.GroupBy(q => q.Manufacturer).ToDictionary(q => q.Key, q => q.Value.ToArray());
< p > GroupBy() 的作用是将所有具有相同匹配键选择器的元素分组。因此,当您告诉它 GroupBy(q => q.Manufacturer) 时,所有具有相同制造商的元素都将作为 IEnumerable<T> 分组在一起。


0
使用ToLookup
var table = pairs.ToLookup(kvp => kvp.Key, kvp => kvp.Value);

foreach(var i in table["tesla"])
   Console.WriteLine(i);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接