2008-12-12 11 views
33

Estoy usando C# en Framework 3.5. Estoy buscando agrupar rápidamente una Lista genérica <> por dos propiedades. Por el bien de este ejemplo, digamos que tengo una Lista de un tipo de orden con propiedades de IdCliente, IdProducto y CoberturaProducto. ¿Cómo obtendría la suma de ProductCounts agrupados por CustomerId y ProductId utilizando una expresión lambda?C# List <> GroupBy 2 Valora

Respuesta

56
var sums = Orders.GroupBy(x => new { x.CustomerID, x.ProductID }) 
       .Select(group => group.Sum(x => x.ProductCount)); 
7

Alternativamente, si desea obtener los identificadores para cada suma, se podría hacer esto

var customerAndProductGroups = 
    from order in Orders 
    orderby order.CustomerID, order.ProductID // orderby not necessary, but neater 
    group order by new { order.CustomerID, order.ProductID }; 

foreach (var customerAndProductGroup in customerAndProductGroups) 
{ 
    Console.WriteLine("Customer {0} has ordered product {1} for a total count of {2}", 
     customerAndProductGroup.Key.CustomerID, 
     customerAndProductGroup.Key.ProductID, 
     customerAndProductGroup.Sum(item => item.ProductCount)); 
} 
16

Soy consciente de que el hilo es muy antiguo, pero ya que acabo luchado a través de esta sintaxis pensé' d publicar mis hallazgos adicionales - se puede devolver la suma y las identificaciones (w/o foreach) en una consulta de este modo:

var sums = Orders 
      .GroupBy(x => new { x.CustomerID, x.ProductID }) 
      .Select(group =>new {group.Key, ProductCount = group.Sum(x => x.ProductCount)}); 

la parte difícil para mí para conseguir que funcione es que la suma debe tener un alias, aparentemente ...

+0

Me di cuenta de que esta respuesta es muy antigua, pero si alguien se preguntaba por qué es necesario el alias, las propiedades generan nombres de campo implícitos pero los métodos no. – Jimmy

-1

var New1 = EmpList.GroupBy (z => z.Age) .OrderBy (Employee => Employee.Key);

dataGridView1.DataSource = New1;

+0

Esta respuesta no parece aplicarse a la pregunta. – Bryan