2009-08-12 16 views
6

Ho una lista di dizionari che hanno chiavi di tipo stringa e valori che sono ints.Come trovare il valore massimo per ogni chiave in un elenco di dizionari utilizzando LINQ?

Molti dizionari contengono le stesse chiavi ma non tutte.

Quindi la mia domanda è: usare LINQ come troverei il valore massimo associato a ciascuna chiave distinta in tutti i dizionari?

Così, per esempio dato l'input seguente:

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}}, 
}; 

vorrei qualche tipo di raccolta che contiene:

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

(Attualmente sto scorrendo l'elenco e tenere traccia delle cose me stesso, mi stavo davvero chiedendo se c'è un modo più carino LINQ di farlo)

MODIFICA: Anche io non so quali sono i tasti stringa in anticipo

risposta

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

e per testare quanto sopra, utilizzare questo

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

per ottenere il seguente output ...

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

Marvelous! Perché è sempre così ovvio quando lo vedi :-) – Argos

+3

Ci sono, naturalmente, molti altri modi per fare la stessa cosa: 'data.SelectMany (d => d) .GroupBy (d => d.Key, d => d.Value, (k, i) => nuovo {GroupName = k, MaxValue = i.Max()}) 'o' da d in data.SelectMany (i => i) gruppo d.Valore di d .Key in g select new {GroupName = g.Key, MaxValue = g.Max()} 'sono due di questi. –

Problemi correlati