2010-03-24 27 views
9

Khi viết một chuỗi phương pháp LINQ, tôi có thể làm ở đâu báo cáo một trong hai cách:LINQ Trường hợp các khoản - Tốt hơn để xếp chồng hoặc kết hợp?

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir") 

Hoặc

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir") 

Có bất kỳ lợi ích của một trong khác không?

Đừng lo lắng quá nhiều về các kiểu dữ liệu trong ví dụ này, nhưng nếu có vấn đề với kiểu dữ liệu, thì đó cũng là điều tốt để biết.

Điều hiển nhiên là đối tượng đã được tham chiếu, vì vậy hai thuộc tính được truy cập cùng một lúc sẽ dễ dàng hơn trên ứng dụng, phải không?

+0

Khi bạn hỏi về lợi ích, bạn đang đề cập đến Hiệu suất, Khả năng đọc hay điều gì đó khác? – Kane

+0

Bất kỳ lợi ích nào ngoại trừ khả năng đọc, vì cả hai đều khá dễ đọc trong POV – Dann

Trả lời

3

Trong ví dụ của bạn, chúng giống nhau và chúng là vấn đề sở thích cá nhân. Do việc thực hiện chậm trễ của LINQ, bộ sưu tập sẽ chỉ được lặp lại một lần.

Nếu bạn muốn kết hợp biểu thức của mình bằng cách sử dụng toán tử hoặc toán tử, bạn chỉ có thể sử dụng biểu thức đầu tiên.

+0

của tôi. Tôi không nhận ra rằng LINQ hoạt động như thế (mặc dù bây giờ có ý nghĩa). Tôi đã nghĩ rằng đầu tiên sẽ là nhanh nhất do so sánh kết hợp. Chúc mừng tôi đã đặt câu hỏi này ngay bây giờ. – Dann

0

Đầu tiên sẽ nhanh hơn một chút vì nó làm giảm phần chi phí. Khác hơn là chúng được xử lý về cơ bản theo cùng một cách.

Một khác biệt đáng chú ý là thuộc tính Color được so sánh trước thuộc tính Age trong ví dụ thứ hai. Nếu bạn muốn có một so sánh rẻ hơn để ngắn mạch một đắt hơn (do đó tài sản Color chỉ so với các mục mà so sánh Age là đúng), bạn nên đặt một rẻ hơn trong Where cuộc gọi cuối cùng:

var blackOldCats = 
    cats 
    .Where(cat => cat.Colour == "noir") 
    .Where(cat => cat.Age > 7); 

Trong trường hợp này không có nhiều sự khác biệt về chi phí so sánh, nhưng nếu giá đắt hơn nhiều so với trường hợp khác thì tốt nhất nên biết thứ tự chúng được đánh giá.

+2

Bạn có thể giải thích lý do tại sao để đưa so sánh rẻ hơn vào cuối, thay vì ở phía trước? Tôi sẽ làm theo cách khác, nhưng chỉ theo bản năng, không vì bất kỳ lý do chính đáng nào. =) – Jens

+1

Tôi đã viết một ứng dụng thử nghiệm nhỏ, xác nhận bản năng của tôi ở đây (hai nơi điều khoản, một tham gia một Thread.Sleep ngắn, khác là nhanh). Mọi cuộc gọi dường như được thực hiện trên kết quả của cuộc gọi trước đó, vì vậy các so sánh rẻ hơn nên là các cuộc gọi đầu tiên. Tôi đã làm một sai lầm? – Jens

+0

Jens là đúng, tuyên bố của bạn là ngược. Tôi chỉ thử nghiệm nó với một phương thức có quyền điều khiển khi nhấn của nó, và các phương thức được thực hiện theo thứ tự, trái sang phải – Dann

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