2013-07-03 13 views
5

Mam kwerendę, która zwraca coś o następującym formacie:Konwersja kwerendy LINQ do Dictionary <string, string []>

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

i chciałbym przekonwertować do słownika <string, string[]> tak:

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

próbowałem z tym:

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

ale do tej pory nie mam jakikolwiek szczęście. Myślę, że to, co to robi, to próbowanie dodawania pojedynczych elementów, takich jak "tesla" : ["model s"] i "tesla" : ["roadster"], i to jest przyczyną niepowodzenia ... łatwego sposobu wykonania tego, co próbuję wykonać w LINQ?

+0

Możliwy duplikat http://stackoverflow.com/questions/7325278/group-by-in-linq? – feralin

Odpowiedz

3

Trzeba by grupy każdą pozycję przez klucz, potem skonstruować słownika:

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

oczywiście, ILookup<string, string> znacznie łatwiejsze:

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

"oczywiście" ... (lol?) – sehe

+0

Doskonałe. Dzięki. Dokładnie tego potrzebuję. –

1

Co chcesz to GroupBy(), a następnie ToDictionary().

Przykład:

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

Co GroupBy() robi to grupa wszystkie elementy, które mają ten sam wybierak pasującego klucza. Więc kiedy powiesz to GroupBy(q => q.Manufacturer), wszystkie elementy, które mają tego samego producenta, zostaną zgrupowane razem jako IEnumerable<T>.

+0

Czy możesz rozwinąć? –

0

Zastosowanie ToLookup:

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

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

Szukasz ToLookup, jeśli chcesz IKE wyniki mają być pogrupowane w obiekcie słowników jak:

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

W przeciwnym razie trzeba będzie grupą wyniki Pierwsze:

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()); 
Powiązane problemy