2013-04-27 33 views
12

tôi cần phải làm những điều sau đây, tôi có một List với một lớp học, trong đó có 2 nguyên id và đếmcách lấy SUM trong LINQ?

Bây giờ tôi muốn làm các truy vấn LINQ sau:

get the sum of the count for each id 

nhưng có thể có mục có id cùng, vì vậy nó nên được summerized ví dụ:

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

Linh hồn là:

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

cách thực hiện việc này?

+0

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

Trả lời

22

Group các mục bằng cách Id và sau đó sum các Count s trong mỗi nhóm:

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

Tôi phải làm gì nếu tôi không muốn sử dụng tính năng mới, chỉ cần tính tổng hợp lên và sau đó lấy lại các đồ vật mà tôi có – gurehbgui

+0

Bạn mong đợi điều gì là kết quả? Một cái gì đó như '{Item = {id = 1, count = 12}, Sum = 14}'? – Caramiriel

+1

@Caramiriel Vâng, có vẻ như anh ta muốn tạo các mục mới cùng loại với các thành phần gốc, với số lượng của chúng được đặt thành tổng số, như: 'var result = items.GroupBy (x => x.Id). Chọn (g => new HisType {id = g.Key, count = g.Sum (x => x.Count)}); ' –

3

Hãy thử nó,

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

Các chương trình sau ...

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