2010-09-08 32 views
14

Có lẽ một câu hỏi ngu ngốc nhưng tôi có rất nhiều:Thay if (x) foreach() với Foreach.Where (x)

if(X) 
{ 
    foreach(var Y in myList.Where(z => z == 1) 
    { 
    } 
} 

cấu trúc trong một số mã
là thay thế nó bằng

foreach(var Y in myList.Where(z => X && z == 1) { } 

điên?

Nó có lẽ ít đọc được hơn, nhưng trình biên dịch có tối ưu hóa nó để làm cho nó khá nhiều mã giống nhau không?

+1

Tránh? Tại sao một người nên tránh điều này? – Yagzii

Trả lời

19

Không, phiên bản đầu tiên của bạn tốt hơn và nhanh hơn. Phiên bản thứ hai sẽ đánh giá X cho mỗi phần tử trong chuỗi bất cứ khi nào X là đúng.

Bạn nên sử dụng phiên bản đầu tiên.

4

Tùy chọn thứ 2 sẽ chậm hơn rất nhiều khi x sai, vì bạn đang thực hiện kiểm tra tất cả các mục trong danh sách khi bạn biết kiểm tra sẽ luôn thất bại.

Trình tối ưu hóa trình biên dịch sẽ không thể hoàn tác tác hại của bạn. Mức độ tối ưu hóa đó chỉ có thể bình thường trong các ngôn ngữ chức năng vì nó quá khó cho trình biên dịch để theo dõi các tác dụng phụ có thể xảy ra.

LINQ không có tối ưu hóa được tích hợp vào nó ở bất kỳ đâu gần với những gì bạn mong đợi từ trình ghi truy vấn SQL trong cơ sở dữ liệu.

1

Chúng sẽ không biên dịch thành cùng một mã. Trong phiên bản thứ hai X được đánh giá nhiều lần và myList được liệt kê. Trường hợp xấu nhất là đánh giá X thay đổi điều gì đó và bạn có chức năng không thể đoán trước.