Đánh giá lười biếng / Thực hiện trì hoãn
Các khối trình lặp "trả về lợi nhuận" sẽ không thực thi bất kỳ mã nào cho đến khi bạn thực sự gọi cho kết quả cụ thể đó. Điều này có nghĩa là chúng cũng có thể được liên kết với nhau một cách hiệu quả. Câu đố vui: đoạn mã sau sẽ lặp lại bao nhiêu lần trên tệp?
var query = File.ReadLines(@"C:\MyFile.txt")
.Where(l => l.Contains("search text") )
.Select(l => int.Parse(l.SubString(5,8))
.Where(i => i > 10 );
int sum=0;
foreach (int value in query)
{
sum += value;
}
Câu trả lời chính xác là một, và điều đó chưa xảy ra foreach
. Mặc dù tôi có ba hàm toán tử linq riêng biệt, chúng tôi vẫn chỉ lặp lại nội dung của tệp một lần.
Điều này có những lợi ích khác ngoài hiệu suất. Ví dụ: tôi có thể viết một phương pháp đơn giản và chung chung để đọc và lọc trước một tệp nhật ký một lần và sử dụng cùng một phương pháp đó ở một số nơi khác nhau, nơi mỗi lần sử dụng sẽ thêm vào các bộ lọc khác nhau. Do đó, tôi duy trì hiệu suất tốt trong khi sử dụng lại mã một cách hiệu quả.
Danh sách vô hạn
Xem câu trả lời của tôi cho câu hỏi này để biết ví dụ điển hình:
Hàm C # fibonacci trả về lỗi
Về cơ bản, tôi triển khai trình tự fibonacci bằng cách sử dụng một khối trình lặp sẽ không bao giờ dừng (ít nhất, không phải trước khi đạt đến MaxInt), và sau đó sử dụng việc triển khai đó một cách an toàn.
Ngữ nghĩa được cải thiện và phân tách các mối quan tâm
Một lần nữa bằng cách sử dụng ví dụ tệp ở trên, giờ đây chúng ta có thể dễ dàng tách mã đọc tệp khỏi mã lọc ra các dòng không cần thiết từ mã thực sự phân tích kết quả. Đặc biệt, cái đầu tiên đó rất có thể tái sử dụng.
Đây là một trong những điều khó giải thích bằng văn xuôi hơn nhiều so với những người có hình ảnh đơn giản 1 :
Nếu bạn không thể nhìn thấy hình ảnh, nó hiển thị hai phiên bản của cùng một mã, với các điểm nổi bật nền cho các mối quan tâm khác nhau. Mã linq có tất cả các màu được nhóm lại độc đáo, trong khi mã mệnh lệnh truyền thống có các màu xen kẽ. Tác giả lập luận (và tôi đồng tình) rằng kết quả này là điển hình của việc sử dụng linq so với sử dụng mã mệnh lệnh ... rằng linq thực hiện tốt hơn công việc tổ chức mã của bạn để có luồng tốt hơn giữa các phần.
1 Tôi tin rằng đây là nguồn gốc: https://twitter.com/mariofusco/status/571999216039542784 . Cũng lưu ý rằng mã này là Java, nhưng C # sẽ tương tự.