2013-04-27 17 views
12

muszę wykonać następujące czynności, mam List z klasy, która zawiera 2 całkowitą id i liczyćjak uzyskać SUM w Linq?

Teraz chcę zrobić następujące kwerendy LINQ:

get the sum of the count for each id 

ale nie może być elementy z ten sam identyfikator, więc powinien on być summerized np

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

sould być:

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

jak to zrobić?

+0

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

Odpowiedz

22

Group pozycje autorstwa Id a następnie sum się Count s w każdej grupie:

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

co mam zrobić, jeśli nie chcesz korzystać z nowego, po prostu je podsumować a potem odzyskałem przedmioty, które miałem – gurehbgui

+0

Czego oczekujesz w wyniku? Coś w rodzaju '{Item = {id = 1, count = 12}, Sum = 14}'? – Caramiriel

+1

@Caramiriel Tak, wygląda na to, że chce utworzyć nowe elementy tego samego rodzaju, co elementy oryginalne, z licznikami ustawionymi na sumy, np .: 'var result = items.GroupBy (x => x.Id). Wybierz (g => nowy HisType {id = g.Key, count = g.Sum (x => x.Count)}); ' –

3

spróbować,

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

następujący program ...

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