Sự khác biệt giữa Find(), First() và FirstOrDefault() trong C#

Sự khác biệt giữa Find(), First() và FirstOrDefault() trong C#

January 2, 2025 0 By Ntech Developers

Lại một câu hỏi phỏng vấn hay gặp. Khi làm việc với 3 phương thức phổ biến là Find(), First() và FirstOrDefault() nhiều anh em hay nhầm lẫn vì mục đích nó tương tự nhưng khác nhau về cách sử dụng, chức năng và hiệu suất.

Dưới đây là so sánh chi tiết và khuyến nghị cho từng phương thức.

1. Find()

Find() là phương thức đặc biệt dành riêng cho kiểu List<T>. Nó tìm kiếm phần tử đầu tiên khớp với một điều kiện và trả về phần tử đó. Nếu không có phần tử nào khớp, nó trả về null.

Đặc điểm

– Chỉ hoạt động với List<T>.

– Trả về phần tử đầu tiên khớp hoặc null nếu không tìm thấy.

– Tối ưu hóa cho hiệu suất khi làm việc với danh sách.

Khi nào nên sử dụng

– Bạn đang làm việc với List<T>.

– Bạn ưu tiên hiệu suất và sử dụng bộ nhớ tối ưu.

– Bạn cần phần tử đầu tiên khớp hoặc null nếu không có phần tử nào phù hợp.

2. First()

First() là một phương thức thuộc LINQ, hoạt động với mọi IEnumerable<T>. Phương thức này trả về phần tử đầu tiên khớp với điều kiện hoặc ném ngoại lệ nếu không có phần tử nào khớp.

Đặc điểm

– Hoạt động với mọi IEnumerable<T>.

– Throw ngoại lệ (InvalidOperationException) nếu không tìm thấy phần tử nào.

– Thích hợp khi bạn chắc chắn rằng có ít nhất một phần tử khớp.

Khi nào nên sử dụng

– Bạn đang làm việc với các collection không phải là List<T>.

– Bạn mong đợi ít nhất một kết quả, và trường hợp không có kết quả được coi là lỗi.

– Bạn chấp nhận ngoại lệ khi không tìm thấy kết quả.

3. FirstOrDefault()

FirstOrDefault() cũng là một phương thức thuộc LINQ, hoạt động với mọi IEnumerable<T>. Tương tự như First(), nó trả về phần tử đầu tiên khớp với điều kiện nhưng thay vì ném ngoại lệ, nó trả về giá trị mặc định (null cho kiểu tham chiếu) nếu không có kết quả.

Đặc điểm

– Hoạt động với mọi IEnumerable<T>.

– Trả về null (hoặc giá trị mặc định) thay vì ném ngoại lệ khi không tìm thấy phần tử nào.

– An toàn hơn trong các trường hợp có thể không có kết quả.

Khi nào nên sử dụng

– Bạn đang làm việc với các collection không phải là List<T>.

– Bạn muốn xử lý an toàn trong trường hợp không có kết quả mà không cần ném ngoại lệ.

– Bạn ưu tiên trả về giá trị mặc định thay vì gây lỗi.

Nếu để so sánh thì:

– Sử dụng Find() khi làm việc với List<T> để tận dụng tối ưu hiệu suất.

– Sử dụng First() cho các collection tổng quát khi bạn chắc chắn rằng sẽ có ít nhất một kết quả và chấp nhận ngoại lệ khi không tìm thấy kết quả.

– Sử dụng FirstOrDefault() khi làm việc với các collection tổng quát và muốn tránh ngoại lệ trong trường hợp không có kết quả, đảm bảo xử lý lỗi an toàn.

Việc chọn đúng phương thức phù hợp với ngữ cảnh có thể cải thiện cả hiệu suất lẫn độ tin cậy của ứng dụng của bạn.

#ntechdevelopers