2008-12-12 55 views
33

Tôi đang sử dụng C# trên Framework 3.5. Tôi đang tìm cách nhanh chóng nhóm một Danh sách chung <> bởi hai thuộc tính. Vì lợi ích của ví dụ này cho phép nói rằng tôi có một List of a Order type với các thuộc tính của CustomerId, ProductId và ProductCount. Làm cách nào tôi nhận được tổng số ProductCount được nhóm theo CustomerId và ProductId bằng cách sử dụng biểu thức lambda?C# Danh sách <> GroupBy 2 Giá trị

Trả lời

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

Ngoài ra, nếu bạn muốn nhận được các ID cho mỗi Tóm lại, bạn có thể làm điều này

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

Tôi nhận ra chủ đề này là rất cũ nhưng kể từ khi tôi chỉ đấu tranh thông qua cú pháp này, tôi nghĩ rằng tôi d gửi phát hiện thêm của tôi - bạn có thể trả lại tiền và các ID (w/o foreach) trong một truy vấn như sau:

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

một phần khó khăn cho tôi để làm cho nó làm việc là tổng phải được aliased, dường như ...

+0

Tôi nhận ra câu trả lời này rất cũ, nhưng nếu có ai thắc mắc tại sao bí danh là cần thiết, các thuộc tính tạo ra tên trường ngầm nhưng phương thức thì không. – Jimmy

-1

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

dataGridView1.DataSource = New1;

+0

Câu trả lời này dường như không áp dụng cho câu hỏi. – Bryan

Các vấn đề liên quan