public static IEnumerable<T> Where<T>(this IEnumerable<T> items, Predicate< T> prodicate)
{
foreach(var item in items)
{
if (predicate(item))
{
// for lazy/deffer execution plus avoid temp collection defined
yield return item;
}
}
}
Từ khóa yield thực sự làm khá nhiều việc ở đây. Nó tạo ra một bộ máy trạng thái "dưới vỏ bọc" ghi nhớ vị trí của bạn trong mỗi chu kỳ bổ sung của chức năng và chọn từ đó.
Hàm trả về một đối tượng thực thi IEnumerable<T> interface. Nếu một hàm đang gọi bắt đầu foreach-in đối tượng này, thì hàm sẽ được gọi lại cho đến khi nó "yield" kết quả dựa trên một số predicate. Đây là cú pháp được giới thiệu trong C# 2.0. Trong các phiên bản trước, bạn phải tạo các đối tượng IEnumerable và IEnumerator của riêng mình để thực hiện những công việc như thế này.