Nên sử dụng Any, Contains hay Exists trong C#

0 0 0

Người đăng: Thang Le

Theo Viblo Asia

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 List<T>, IEnumerable<T> hoặc array, việc sử dụng phương thức Contains 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 List<T> hoặc mảng. Với cơ chế tìm kiếm tuyến tính như trên nhưng bây giờ nhận vào tham số là một delegate để check điều kiện (enumerator), điều này dẫn đến tốc độ sẽ chậm hơn so với Contains.

Ngược lại, phương thức Any của LINQ có thể áp dụng cho mọi kiểu IEnumerable<T> (List<T> kế thừa từ đây nên vẫn xài được, array cũng tương tự), mang lại sự linh hoạt cao.

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õ {% post_link Tham-chieu-va-tham-tri-trong-lap-trinh '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ụ

using System.Collections.Generic;
using System.Linq; public class Program
{ static void Main(string[] args) { var listNumber = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; listNumber.Contains(6); listNumber.Exists(a => a == 6); listNumber.Any(a => a == 6); }
}

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ý List<T> hoặc mảng hãy chọn Exists. 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: image.png

Bình luận

Bài viết tương tự

- vừa được xem lúc

Các loại tham chiếu Nullable trong C# (Phần 1)

1. Giới thiệu. C# 8.0 giới thiệu kiểu tham chiếu nullable và kiểu tham chiếu non-nullable cho phép bạn đưa ra các lựa chọn quan trọng về thuộc tính cho các biến kiểu tham chiếu:.

0 0 60

- vừa được xem lúc

Command pattern qua ví dụ !

Command pattern là gì . Command pattern khá phổ biến trong C #, đặc biệt khi chúng ta muốn trì hoãn hoặc xếp hàng đợi việc thực hiện một yêu cầu hoặc khi chúng ta muốn theo dõi các hoạt động. Hơn nữa, chúng ta có thể hoàn tác tác chúng. .

0 0 199

- vừa được xem lúc

Hiểu Liskov Substitution Principle qua ví dụ !

Liskov Substitution Principle là gì . Nguyên tắc đóng mở xác đinh rằng các instance của lớp con có thể thay thế được instance lớp cha mà vẫn đảm bảo tính đúng đắn của chương trình.

0 0 41

- vừa được xem lúc

Creating custom Controls Wpf

Introduction. Wpf/winforms provides various controls like Buttons, Textbox, TextBlock, Labels etc.

0 0 59

- vừa được xem lúc

[P1] Chọn công nghệ nào để xây dựng website?

Hiện nay nhu cầu phát triển website, app tăng rất cao do xu hướng "số hóa 4.0" trong và ngoài nước.

0 0 90

- vừa được xem lúc

Kiểu dữ liệu trong C#

Dẫn nhập. Ở bài BIẾN TRONG C# chúng ta đã tìm hiểu về biến và có một thành phần không thể thiếu khi khai báo biến – Đó là kiểu dữ liệu.

0 0 42