Ai đó có thể giải thích các hàm LINQ ở đâu (..) và FindAll (..) khác nhau không? Cả hai dường như làm điều tương tự ...
Ai đó có thể giải thích các hàm LINQ ở đâu (..) và FindAll (..) khác nhau không? Cả hai dường như làm điều tương tự ...
Câu trả lời:
FindAll()
là một hàm trên List<T>
loại, nó không phải là một phương thức mở rộng LINQ như thế nào Where
. Các phương thức mở rộng LINQ hoạt động trên bất kỳ loại nào thực hiện IEnumerable
, trong khi đó FindAll
chỉ có thể được sử dụng trong các List<T>
trường hợp (hoặc các trường hợp của các lớp kế thừa từ nó, tất nhiên).
Ngoài ra, chúng khác nhau về mục đích thực tế. Where
trả về một thể hiện của IEnumerable
nó được thực thi theo yêu cầu khi đối tượng được liệt kê. FindAll
trả về một cái mới List<T>
có chứa các yếu tố được yêu cầu. FindAll
giống như gọi Where(...).ToList()
trên một ví dụ của IEnumerable
.
Sự khác biệt lớn nhất đối với tôi là .indind ALL cũng có sẵn trong .Net 2.0. Tôi không phải lúc nào cũng có chương trình sang trọng trong .Net 3.5, vì vậy tôi cố gắng ghi nhớ các phương thức 'bản địa' của các bộ sưu tập chung .Net.
Nó đã xảy ra nhiều lần khi tôi tự thực hiện một phương thức Danh sách đã có sẵn vì tôi không thể LINQ nó.
Điều tôi thấy hữu ích trong trường hợp này là, bằng cách sử dụng VS2008, tôi có thể sử dụng kiểu suy luận và cú pháp lambda. Đây là các tính năng biên dịch, không phải tính năng khung. Điều này có nghĩa là tôi có thể viết cái này và vẫn còn trong .Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
Nhưng nếu bạn có sẵn LINQ, việc giữ sự khác biệt giữa thực thi hoãn lại và thực thi ngay lập tức là rất quan trọng.
Nếu tôi nhớ lại một cách chính xác, sự khác biệt chính (bên cạnh những gì họ đã thực hiện trên: IEnumerable<T>
vs. List<T>
) là Where
thực hiện việc thực thi bị trì hoãn, trong đó nó không thực sự tìm kiếm cho đến khi bạn cần nó - ví dụ sử dụng nó trong một vòng lặp foreach. FindAll
là một phương pháp thực hiện ngay lập tức.
Tôi đã thực hiện một số thử nghiệm trên danh sách các đối tượng 80K và thấy rằng Find()
có thể nhanh hơn 1000% so với sử dụng Where
với FirstOrDefault()
. Tôi không biết rằng cho đến khi kiểm tra bộ đếm thời gian trước và sau mỗi cuộc gọi. Đôi khi nó là cùng một lúc, lần khác nó nhanh hơn.