LINQ, Where () so với Find ALL ()


Câu trả lời:


202

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 đó FindAllchỉ 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ế. Wheretrả về một thể hiện của IEnumerablenó được thực thi theo yêu cầu khi đối tượng được liệt kê. FindAlltrả về một cái mới List<T>có chứa các yếu tố được yêu cầu. FindAllgiống như gọi Where(...).ToList()trên một ví dụ của IEnumerable.


20
Có, phiên bản lười biếng của findall ở đâu
Pierreten

2
code.msdn.microsoft.com/LINEQ-Query-Execut-ce0d3b95 giải thích sự khác biệt giữa lười biếng (hoãn lại) và thực thi ngay lập tức. Về cơ bản, trong một số trường hợp, bạn không cần toàn bộ danh sách, bạn có thể muốn lặp qua các mục cho đến khi có điều gì đó xảy ra, sau đó dừng lại. Đây là nơi lười biếng có ích, nhưng tùy thuộc vào việc thực hiện, có thể dẫn đến kết quả không thể đoán trước (tất cả được giải thích trong liên kết). Hi vọng điêu nay co ich.
Nhím

10

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.


6

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à Wherethự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. FindAlllà một phương pháp thực hiện ngay lập tức.


3

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 Wherevớ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.


5
Bạn đã thử truy cập vào bộ sưu tập là tốt? Enumerable.Where () sử dụng thực thi bị trì hoãn và không được đánh giá trước khi bộ sưu tập được truy cập, điều này có thể dẫn đến các quan niệm sai về việc nó có thực sự nhanh hơn hay không. Tuy nhiên, phần lớn, thường nhanh hơn để sử dụng liệt kê thay vì các bộ sưu tập tĩnh (như Loại <T> và Mảng <T>).
Sebastian Job Bjørnager Jensen

Câu hỏi là về Find ALL. Rõ ràng là Tìm sẽ nhanh hơn Địa điểm (lấy tất cả các giá trị) và nhận FirstOrDefault
Vivek MVK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.