2009-10-30 21 views
10

Với các đối tượng sau đây:LINQ: Làm thế nào để truy vấn các mục từ một bộ sưu tập cho đến khi số tiền đạt đến một giá trị nhất định

public class Product { 
    string Name {get;} 
    int Quantity {get;} 
} 

sử dụng LINQ, làm thế nào tôi sẽ truy vấn một List<Product> cho đến khi tôi nhận được một khoản tiền >= một số lượng nhất định? Nói cách khác, nếu danh sách của tôi trông giống như

Name  Quantity 
----------------- 
prod1  5 
prod2  6 
prod7  7 

Tôi muốn truy vấn Danh sách và kéo các trường hợp cho đến khi tôi nhận được tổng số >=8. Trong trường hợp này, tôi sẽ nhận được hai mục đầu tiên trong Danh sách. Nếu tôi muốn tổng số >= 12, tôi sẽ nhận được cả ba.

Tôi biết tôi có thể viết một vòng lặp để làm điều này cho tôi, nhưng tôi đã tưởng tượng rằng có một số lớp lót trơn bằng cách sử dụng LINQ để đạt được điều tương tự.

Cảm ơn

Trả lời

16

Dưới đây là 2 lớp lót nhanh.

var sum = 0; 
var query = col.Where(x => { var temp = sum; sum += x.Quantity; return temp < 500; }); 

Thay 500 bằng hằng số hoặc biến mà bạn chọn.

EDIT

Đây là mquander của giải pháp hiệu quả hơn

var sum = 0; 
var query = col.TakeWhile(x => { var temp = sum; sum += x.Quantity; return temp < 500; }); 
+1

Thật ngọt ngào .. – jlembke

+9

Sẽ hiệu quả hơn nếu bạn làm điều tương tự ngoại trừ thay vì. Trong đó(), để sử dụng .TakeWhile(), và kiểm tra xem tổng số lúc bắt đầu lớn hơn 500, không phải ở cuối (nếu không bạn sẽ lấy một phần tử quá ít.) Sau đó, việc lặp lại sẽ chấm dứt khi hàng rào 500 là bị hỏng. – mquander

+0

@mquander, cả hai điểm tốt, cập nhật câu trả lời – JaredPar

1

Bạn chỉ cần tạo một biến để giữ Tóm lại, sau đó thêm vào nó như là mỗi mục trong danh sách được thử nghiệm với các khoản where :

int sum = 0; 
from product in list where (sum += product.Quantity) < 8 select product 
+0

Điều thú vị là, tôi càng sử dụng LINQ, tôi càng thấy mình nghiêng về phía cú pháp phương pháp mở rộng, ngoại trừ trong trường hợp tôi truy vấn nguồn theo kiểu rất sql-ish. Tôi tự hỏi nếu đó là một mô hình phổ biến của việc sử dụng LINQ? –

+0

Có thể - đó vẫn là những ngày đầu cho tôi. – GraemeF

+2

Đó là mô hình sử dụng là những gì tôi đã có kinh nghiệm ... Có rất ít điểm để viết rằng từ và chọn khoản nếu bạn chỉ muốn lọc. Tôi quay trở lại cú pháp hiểu truy vấn để sử dụng mệnh đề "let". –

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