:)
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
).
Suena sospechosamente como tarea. –
O una pregunta de entrevista ... la tarea no implica generalmente "ToUpper" –
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 :) –