2013-07-03 17 views
5

Ho una query che restituisce qualcosa del seguente formato:Conversione di una query LINQ in un Dictionary <string, string []>

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

e vorrei convertire questo a un dizionario di <string, string[]> in questo modo:

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

ho provato con questo:

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

ma finora non sto avendo alcuna fortuna. Penso che ciò che sta facendo in realtà stia cercando di aggiungere singoli elementi come "tesla" : ["model s"] e "tesla" : ["roadster"] e questo è il motivo per cui sta fallendo ... un modo semplice per realizzare ciò che sto cercando di fare in LINQ?

+0

Eventuali duplicati di http://stackoverflow.com/questions/7325278/group-by-a-LINQ? – feralin

risposta

3

si avrebbe bisogno di gruppo di ogni elemento con il tasto, poi costruire il dizionario:

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()); 

Naturalmente, un ILookup<string, string> molto più facile:

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

"ovviamente" ... (lol?) – sehe

+0

Eccellente. Grazie. Questo è esattamente ciò di cui ho bisogno. –

1

Quello che vuoi è GroupBy(), seguito da ToDictionary().

Esempio:

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

Nei GroupBy() fa è raggruppare tutti gli elementi che hanno la stessa corrispondenza selettore a chiave. Quindi, quando lo comunichi allo GroupBy(q => q.Manufacturer), tutti gli elementi che hanno lo stesso produttore saranno raggruppati insieme come IEnumerable<T>.

+0

Puoi elaborare? –

0

Uso ToLookup:

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

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

stai cercando ToLookup se vuoi l IKE i risultati per essere raggruppati in un oggetto simile ai dizionari:

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

In caso contrario si dovrà raggruppare i risultati del primo:

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()); 
Problemi correlati