Thực hiện LINQ đơn giản nghĩa là triển khai các phương thức LINQ dự kiến sẽ ở đó, chẳng hạn như Where
hoặc Select
, với chữ ký chính xác. Mặc dù nhận thức chung, bạn không phải triển khai giao diện IEnumerable
cho lớp của mình để hỗ trợ LINQ. Tuy nhiên, việc triển khai IEnumerable
sẽ tự động giúp bạn hoàn thành toàn bộ các phương pháp LINQ trên lớp học Enumerable
gần như miễn phí - bạn chỉ phải triển khai GetEnumerator
và lớp IEnumerator
.
Có một vài ví dụ về cách triển khai IEnumerable
trên blog của tôi, trong bài đăng này về the Iterator pattern.
Tuy nhiên, nếu nó không có ý nghĩa đối với lớp học của bạn để được liệt kê, bạn không cần phải làm như vậy. Bạn chỉ cần triển khai trực tiếp các phương thức LINQ thích hợp. LINQ không thực sự quan tâm làm thế nào các phương thức được xác định, miễn là các biên dịch C#. Nghĩa là, nếu bạn viết:
from p in myPlist where p.Thing == "Thing" select p;
các biên dịch C# dịch này thành:
mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
Chừng nào mà biên dịch, LINQ sẽ làm việc. Để xem các chữ ký chính xác cho các phương thức, hãy xem như tài liệu MSDN list of LINQ query methods. Ví dụ (giả sử rằng PList
của bạn là một danh sách các PListItem
s):
public class PList
{
public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
{
foreach (var item in this.items)
{
if (predicate(item))
{
yield return item;
}
}
}
}
Trong khi thực hiện LINQ trực tiếp theo cách này cung cấp cho bạn kiểm soát nhiều hơn trong cách ứng xử, đó là một nhiều nhiều việc để có được nó đúng, và bạn cần hiểu ý nghĩa của các giá trị trả về của bạn, và chuỗi các cuộc gọi LINQ, v.v. Nói chung, nếu bạn có thể loại bỏ việc thực hiện lớp học của mình IEnumerable
và để C# thực hiện tất cả công việc cho bạn, mọi thứ trở nên dễ dàng hơn nhiều.
btw, bài đăng blog hay! –