2008-12-12 5 views
33

Ich verwende C# auf Framework 3.5. Ich möchte eine generische Liste <> um zwei Eigenschaften gruppieren. Für dieses Beispiel nehmen wir an, dass ich eine Liste eines Auftragstyps mit Eigenschaften von CustomerId, ProductId und ProductCount habe. Wie bekomme ich die Summe der ProductCounts, gruppiert nach CustomerId und ProductId, mithilfe eines Lambda-Ausdrucks?C# List <> GroupBy 2 Werte

Antwort

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

Alternativ, wenn Sie die IDs für jede Summe erhalten möchten, können Sie tun, um diese

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

Ich weiß, das Gewinde sehr alt, aber da ich gerade durch diese Syntax kämpfte ich dachte, dass ich d meine zusätzliche Erkenntnisse veröffentlichen - in einer Abfrage wie so dass Sie die Summe und die IDs zurückgeben können (w/o foreach):

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

der schwierige Teil für mich arbeiten zu lassen, ist, dass die Summe aliased werden muß, anscheinend ...

+0

Ich weiß, dass diese Antwort sehr alt ist, aber wenn jemand sich fragt, warum der Alias ​​notwendig ist, erzeugen Eigenschaften implizite Feldnamen, aber Methoden nicht. – Jimmy

-1

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

dataGridView1.DataSource = Neu1;

+0

Diese Antwort scheint nicht auf die Frage zutreffen. – Bryan