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でやろうとしていることを達成する簡単な方法はありますか?

4

4 に答える 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);
于 2013-07-03T18:44:46.233 に答える
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());
于 2013-07-03T18:45:49.543 に答える
1

あなたが望むのはGroupBy()、その後に続くToDictionary().

例:

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

GroupBy()同じ一致するキー セレクターを持つすべての要素をグループ化します。そのため、に伝えるとGroupBy(q => q.Manufacturer)、同じメーカーを持つすべての要素が としてグループ化されIEnumerable<T>ます。

于 2013-07-03T18:43:49.170 に答える
0

ToLookupを使用します。

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

foreach(var i in table["tesla"])
   Console.WriteLine(i);
于 2013-07-03T18:44:10.270 に答える