2009-08-12 18 views
6

Mam listę słowników, które mają klucze typu ciąg i wartości, które są ints.Jak znaleźć maksymalną wartość dla każdego klucza na liście słowników za pomocą LINQ?

Wiele słowników zawiera te same klucze, ale nie wszystkie.

Moje pytanie brzmi: używając LINQ, jak znaleźć maksymalną wartość powiązaną z każdym odrębnym kluczem we wszystkich słownikach?

Tak na przykład, biorąc pod uwagę następujące wejścia:

var data = new List<Dictionary<string, int>> 
{ 
    new Dictionary<string, int> {{"alpha", 4}, {"gorilla", 2}, {"gamma", 3}}, 
    new Dictionary<string, int> {{"alpha", 1}, {"beta", 3}, {"gamma", 1}}, 
    new Dictionary<string, int> {{"monkey", 2}, {"beta", 2}, {"gamma", 2}}, 
}; 

Chciałbym jakąś kolekcji, która zawiera:

{"alpha", 4}, 
{"gorilla", 2}, 
{"gamma", 3}, 
{"beta", 3}, 
{"monkey", 2} 

(obecnie jestem pętli listę i śledzenie rzeczy siebie, naprawdę właśnie zastanawiasz się, czy jest ładniejszy LINQ-esque sposób zrobienia tego)

EDYCJA: Ja także nie wiem, co klucze strunowe są z góry

Odpowiedz

9
var results = data.SelectMany(d => d) 
        .GroupBy(d => d.Key) 
        .Select(g => new 
{ 
    GroupName = g.Key, 
    MaxValue = g.Max(i => i.Value) 
}); 

i przetestować powyższe, należy użyć tego

foreach (var item in results) 
{ 
    Console.WriteLine(item); 
} 

aby uzyskać następujące dane wyjściowe ...

{ GroupName = alpha, MaxValue = 4 } 
{ GroupName = gorilla, MaxValue = 2 } 
{ GroupName = gamma, MaxValue = 3 } 
{ GroupName = beta, MaxValue = 3 } 
{ GroupName = monkey, MaxValue = 2 } 
+0

Marvelous! Dlaczego jest to zawsze tak oczywiste, gdy widzisz :-) – Argos

+3

Istnieje oczywiście wiele innych sposobów robienia tego samego: 'data.SelectMany (d => d) .Grupa (d => d.Key, d => d.Value, (k, i) => new {GroupName = k, MaxValue = i.Max()}) 'lub' od d w data.SelectMany (i => i) grupa d.wartość przez d .Key do g wybierz nowy {GroupName = g.Key, MaxValue = g.Max()} 'są dwie z nich. –

Powiązane problemy