2009-08-12 12 views
6

Tengo una lista de diccionarios que tienen claves de tipo cadena y valores que son enteros.¿Cómo encontrar el valor máximo para cada clave en una lista de diccionarios utilizando LINQ?

Muchos de los diccionarios tienen las mismas teclas pero no todas.

Así que mi pregunta es: utilizando LINQ, ¿cómo puedo encontrar el valor máximo asociado con cada clave distinta en todos los diccionarios?

Así, por ejemplo, dada la siguiente entrada:

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

me gustaría algún tipo de colección que contiene:

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

(estoy actualmente bucle a través de la lista y hacer el seguimiento de las cosas yo mismo, realmente me pregunto si hay una forma más bonita de LINQ-esque de hacerlo)

EDITAR: Tampoco sé lo que las teclas de secuencia están por adelantado

Respuesta

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

y para probar lo anterior, utilizar este

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

para obtener la siguiente salida ...

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

maravilloso! ¿Por qué siempre es tan obvio cuando lo ves :-) – Argos

+3

Hay, por supuesto, muchas otras formas de hacer lo mismo: 'data.SelectMany (d => d) .GroupBy (d => d.Key, d => d.Valor, (k, i) => nuevo {GroupName = k, MaxValue = i.Max()}) 'o' de d en data.SelectMany (i => i) group d.Value by d .Key en g seleccione nuevo {GroupName = g.Key, MaxValue = g.Max()} 'son dos de ellos. –

Cuestiones relacionadas