Có bao giờ bạn thắc mắc Any
, Contains
hay Exists
nên dùng cái nào không, sao phải “đẻ” ra 3 thằng vậy nhỉ! Bây giờ cùng mình coi thử tại sao nha. Let’s go!
Dùng cái nào?
Khi làm việc với ListContains
sẽ tận dụng tối đa hiệu quả của chúng nhờ vào cách chúng được thiết kế bên trong (tìm kiếm bằng tuyến tính dựa vào index, dùng vòng lặp for cơ bản), đảm bảo hiệu suất cao nhất.
Còn với Exists
, chúng ta chỉ có thể dùng với ListContains
.
Ngược lại, phương thức Any
của LINQ có thể áp dụng cho mọi kiểu IEnumerable
Tuy nhiên, chính sự linh hoạt này lại khiến Any
chạy chậm hơn Exists
do phải tạo ra enumerator + xài foreach và có thêm một số chi phí khác (check điều kiện throw exception này nọ).
Cả ba có điểm chung của 3 method này là đều tìm kiếm bằng tuyến tính với độ phức tạp O(n).
Có chút lưu ý, Contains
nếu sử dụng không khéo, nhất là khi không hiểu rõ tham chiếu tham trị thì dễ bị toang => không sử dụng Contains để check với list hoặc mảng kiểu object (tham chiếu). Còn với Any
, Exists
khi viết điều kiện so sánh, phần nào chúng ta đã nắm rõ đang so sánh cái gì.
Ví dụ
1 | using System.Collections.Generic; |
Tóm lại
Chốt lại, nếu bạn biết rõ đang so sánh cái gì, đang so sánh giá trị, thì ưu tiên xài Contains
, còn ngược lại nếu đang xử lý ListExists
. Còn nếu bạn cần một phương thức tổng quát hơn, có thể sử dụng cho nhiều loại bộ sưu tập khác nhau, Any
sẽ là lựa chọn hợp lý.
So sánh tốc độ
Đây là so sánh tốc độ của ba thằng với nhau (list, mảng, ienumerable có 10000 phần tử kiểu int), hãy nhìn vào cột 1, 2 và 5 nhé, lấy thằng ListAny làm chuẩn:
