2009-03-29 14 views
5
class Category 
{   
    public string Name { get; set; } 
    public int Count { get; set;} 
} 


Name Count 
AA 2 
BB 3 
AA 4 

Ich habe ein IEnumerable<Category>Linq Aggregat

und möchte eine Liste von Kategorien mit eindeutigen Namen erhalten und die Summe aus mehreren Einträgen

Ausgabe

Name Count 
AA 6 
BB 3 

-Update

class Category 
{ 
public string Name { get; set; } 
public int CountA { get; set;} 
public int CountB { get; set;} 
public string Phone { get; set;} 
} 

Wie würde ich zwei Spalten summieren. und das Telefon Spalt kann die letzte Zeile oder jede Zeile

Antwort

1
var foo = new List<Category>() { 
       new Category() { Name = "AA", Count = 2}, 
       new Category() { Name = "BB", Count = 3}, 
       new Category() { Name = "AA", Count = 4} 
      }; 

      var bar = foo.GroupBy(c => c.Name).Select(g => new Category(){ Name = g.Key, Count = g.Sum(c => c.Count) }); 
+0

Klasse Kategorie { öffentliche Zeichenkette Name {get; einstellen; } public int CountA {erhalten; set;} public int AnzahlB {get; set;} public string Telefon {get; Set;} } Wie würde ich zwei Spalten summieren. und die Telefonspalte kann die letzte Zeile oder irgendeine Zeile sein –

5

Ihre aktualisierte Frage nicht ganz klar, in Bezug auf die Telefonnummer, aber ich vermute, Sie wollen so etwas wie:

var query = from category in list 
       group category by category.Name into grouped 
       select new { Name = grouped.Key, 
          SumA = grouped.Sum(x => x.CountA), 
          SumB = grouped.Sum(x => x.CountB), 
          Phone = grouped.Last().Phone }; 

ändern grouped.Last() zu grouped.First() wäre übrigens effizienter.

Die Bewertung mehrerer Aggregate auf diese Weise ist im Allgemeinen nicht sehr effizient. Das Projekt Push LINQ, das von mir und Marc Gravell entwickelt wurde, macht es sehr viel effizienter auf Kosten von nicht so einfach zu bedienen. Vielleicht möchten Sie es untersuchen, wenn Sie mit einer Menge Daten umgehen müssen.