# Phân tích các cấu trúc dữ liệu phổ biến trong C#

Việc sử dụng cấu trúc dữ liệu với đúng công việc cũng là một kỹ năng quan trọng trong lập trình. Việc lựa chọn sai có thể khiến cho ứng dụng của bạn chậm đi đáng kể.

### Tóm tắt

<table id="bkmrk-ki%E1%BB%83u-d%E1%BB%AF-li%E1%BB%87utruy-c%E1%BA%ADp"><colgroup><col style="width: 136px;"></col><col style="width: 184px;"></col><col style="width: 316px;"></col><col style="width: 180px;"></col><col style="width: 149px;"></col><col style="width: 360px;"></col></colgroup><tbody><tr style="height: 10px;"><th>****Kiểu dữ liệu****

</th><th>****Truy cập**** (index/key)

</th><th>****Tìm kiếm****

</th><th>****Thêm**** (cuối)

</th><th>****Thêm**** (giữa)

</th><th>****Xóa**** (giữa)

</th></tr><tr><td>****Array****

</td><td>O(1)

</td><td>O(n)

</td><td><span style="white-space: pre-wrap;">O(1) </span>**(chưa đầy)**  
<span style="white-space: pre-wrap;">O(n) </span>**(đầy)**

</td><td>O(n)

</td><td>O(n)

</td></tr><tr><td>****List&lt;T&gt;****

</td><td>O(1)

</td><td>O(n)

</td><td>O(1)

</td><td>O(n)

</td><td>O(n)

</td></tr><tr><td>****Dictionary&lt;TKey, TValua&gt;****

</td><td>O(1)

</td><td><span style="white-space: pre-wrap;">O(1) </span>**(theo key)**  
O(n) **(theo value)**

</td><td>O(1)

</td><td>x

</td><td>O(1)

</td></tr><tr><td>****HashSet&lt;T&gt;****

</td><td>x

</td><td>O(1)

</td><td>O(1)

</td><td>x

</td><td>O(1)

</td></tr><tr><td>****Queue&lt;T&gt;****

</td><td>x

</td><td>O(n)

</td><td>O(1)

</td><td>x

</td><td>O(1)

</td></tr><tr><td>****Stack&lt;T&gt;****

</td><td>x

</td><td>O(n)

</td><td>O(1)

</td><td>x

</td><td>O(1)

</td></tr></tbody></table>

### Lưu ý khi sử dụng

- Sử dụng Array, List khi cần truy cập nhanh theo chỉ số.
    - Array nhẹ hơn do không có chi phí quản lý
    - List nhiều tiện ích (thêm, sửa, xoá, kiểm tra...)
- Sử dụng Dictionary khi cần tìm kiếm nhanh theo khoá.
- Sử dụng Queue, Stack khi cần thêm/xoá ở đầu hoặc cuối.
- Sử dụng HashSet cho danh sách không trùng lặp, không cần truy cập từng phần tử riêng lẻ.