2010-06-04 22 views
8

¡Solo estoy pensando en Linq y me estoy divirtiendo! ¿Puede alguien ayudarme con una consulta para esto:
tengo una lista de datos: 1. LINQ: Selección de elementos de una lista (Agrupar por/Seleccionar/Suma y Máx.)

 
    Key Value 
    Aaa 12 
    AaA 10 
    AAa 5 
    BBB 2 
    Bbb 1 
que desea agrupar por Key.ToUpper()
2. Por cada grupo necesito el Max (Valor) & Suma (valor)
3. Por cada grupo de deseo seleccionar las entradas Allí el valor = Max (valor)
el resultado final debe ser como este:
 
    Key Max Total 
    AaA 12 27 
    AAa 12 27 
    Bbb 2 3
Gracias!

actualización, en realidad yo también necesito la llave de la entrada máxima:

 
    Key Max Total Correct 
    AaA 12 27 Aaa 
    AAa 12 27 Aaa 
    Bbb 2 3  BBB

+3

Suena sospechosamente como tarea. –

+0

O una pregunta de entrevista ... la tarea no implica generalmente "ToUpper" –

+0

Ni los chicos, verías en mi perfil que estoy un poco pasada de casa :) Y no soy realmente un codificador profesional [nunca más], solo por diversión :) –

Respuesta

16

:)

var results = 
    from kvp in source 
    group kvp by kvp.Key.ToUpper() into g 
    select new 
    { 
    Group = g, 
    Max = g.Max(kvp => kvp.Value), 
    Total = g.Sum(kvp => kvp.Value) 
    } into ag 
    from x in ag.Group //SelectMany 
    where x.Value != ag.Max 
    //for the update to the question - note: possibly ambiguous 
    let correct = ag.Group.Where(y => y.Value == ag.Max).First().Key 
    select new 
    { 
    Key = x.Key, 
    Max = ag.Max, 
    Total = ag.Total, 
    Correct = correct 
    }; 

yo un poco como la pregunta debido a todas las pequeñas piezas (algunos se utilizan raramente) que son requerido para hacer la respuesta.


Max = g.Max(kvp => kvp.Value), 
Total = g.Sum(kvp => kvp.Value) 

La realización de varias agrupaciones en un grupo es sencillo, pero difícil si usted no sabe cómo hacerlo.


select a into b 

Esta cláusula se lleva todo lo que pasó antes y comienza una nueva consulta con el objetivo. Sin ella, tendría que iniciar una nueva consulta como esta:

var A = ... select a 

var B = from b in A 

Es importante tener en cuenta que la cláusula select into elimina kvp y g de alcance.


from b in source 
    from a in b.A //SelectMany 

Este "desempaquetar" de la colección de niño cumpla mi consulta acerca de b en una consulta sobre aes. A diferencia de la sobrecarga Enumerable.SelectMany predeterminada, deja el elemento primario (b) en el alcance.


where x.Value != ag.Max 

Comparando la propiedad de un niño con la propiedad de los padres? Encantador. Es importante que recuerde dividir where en cualquier momento que desee filtrar, incluso si acaba de agrupar (no hay HAVING).

+0

Wowsers, respuesta rápida y perfecto. ¡Gracias! –

+0

Me alegra haber podido hacer cosquillas en las partes menos usadas de LINQ. Creo que la pequeña adición hace que sea un poco más complicado? –

+0

Actualizado. La ambigüedad proviene de la posibilidad de que varias filas puedan tener el mismo valor máximo. También quiero mencionar que si todas las filas de una clave determinada tienen el mismo valor, no se devuelven las filas. –

Cuestiones relacionadas