2013-04-27 12 views
12

Ich muss folgendes tun, habe ich eine List mit einer Klasse, die id 2 ganze Zahl enthält und zählenWie bekomme ich eine SUMME in Linq?

Jetzt will ich die folgende Linq-Abfrage tun:

get the sum of the count for each id 

aber kann es Elemente sein mit die gleiche ID, so sollte es summerized wie zB:

id=1, count=12 
id=2, count=1 
id=1, count=2 

sould sein:

id=1 -> sum 14 
id=2 -> sum 1 

Wie geht das?

+0

101 LINQ Samples: http://code.msdn.microsoft.com/LINQ-Aggregate-Operators-c51b3869#CountConditional –

Antwort

22

Group die Einzelteile von Id und dann sum die Count s in jeder Gruppe:

var result = items.GroupBy(x => x.Id) 
        .Select(g => new { Id = g.Key, Sum = g.Sum(x => x.Count) }); 
+0

was muss ich tun, wenn ich nicht wollen, das neue verwenden, nur um es zusammenzufassen up und dann die Objekte zurück, die ich hatte – gurehbgui

+0

Was erwarten Sie als Ergebnis? Etwas wie '{Item = {id = 1, count = 12}, Summe = 14}'? – Caramiriel

+1

@Caramiriel Ja, es sieht so aus, als ob er neue Elemente vom gleichen Typ wie die ursprünglichen Elemente erstellen möchte, wobei ihre Anzahl auf die Summe gesetzt wird, wie: 'var result = items.GroupBy (x => x.Id). Wählen Sie (g => new HisType {id = g.Key, count = g.Sum (x => x.Count)}); ' –

3

Probieren Sie es aus,

.GroupBy(x => x.id) 
.Select(n => n.Sum(m => m.count)); 
1

Das folgende Programm ...

struct Item { 
    public int Id; 
    public int Count; 
} 

class Program { 

    static void Main(string[] args) { 

     var items = new [] { 
      new Item { Id = 1, Count = 12 }, 
      new Item { Id = 2, Count = 1 }, 
      new Item { Id = 1, Count = 2 } 
     }; 

     var results = 
      from item in items 
      group item by item.Id 
      into g 
      select new { Id = g.Key, Count = g.Sum(item => item.Count) }; 

     foreach (var result in results) { 
      Console.Write(result.Id); 
      Console.Write("\t"); 
      Console.WriteLine(result.Count); 
     } 

    } 

} 

. ..prints:

1  14 
2  1 
Verwandte Themen