Tìm hiểu về các loại Collection trong C#
Trong C#, collections là các cấu trúc dữ liệu được sử dụng để lưu trữ và quản lý các nhóm đối tượng. C# cung cấp nhiều loại collections khác nhau để phù hợp với các yêu cầu cụ thể của lập trình viên. Dưới đây là phân loại và giới thiệu chi tiết về các loại collections:
1. Non-Generic Collections
Được định nghĩa trong namespace System.Collections. Những collection này không yêu cầu kiểu dữ liệu cụ thể cho các phần tử mà chúng lưu trữ.
Các loại phổ biến:
- ArrayList: Lưu trữ các phần tử không có kiểu cụ thể. Kích thước có thể thay đổi linh hoạt.
- Ưu điểm: Dễ sử dụng khi không biết kiểu dữ liệu chính xác.
- Nhược điểm: Hiệu suất kém hơn so với collections generic và không an toàn kiểu dữ liệu.
- Hashtable: Lưu trữ các cặp key-value. Các khóa không thể trùng lặp.
- Queue: Thực hiện theo cơ chế FIFO (First In First Out).
- Stack: Thực hiện theo cơ chế LIFO (Last In First Out).
2. Generic Collections
Được định nghĩa trong namespace System.Collections.Generic. Các collection này yêu cầu xác định kiểu dữ liệu ngay khi khai báo, giúp an toàn kiểu và hiệu suất cao hơn.
Các loại phổ biến:
- List<T>:
- Lưu trữ danh sách các phần tử có kiểu xác định.
- Tương tự như ArrayList nhưng an toàn kiểu.
List<int> numbers = new List<int> { 1, 2, 3 };
numbers.Add(4); // Thêm phần tử
- Dictionary<TKey, TValue>:
- Lưu trữ các cặp key-value với kiểu xác định.
- Các key là duy nhất.
Dictionary<int, string> students = new Dictionary<int, string>();
students.Add(1, "Alice");
- Queue<T>:
- Queue generic với kiểu dữ liệu xác định.
- Stack<T>:
- Stack generic với kiểu dữ liệu xác định.
- HashSet<T>:
- Một tập hợp không chứa các phần tử trùng lặp.
3. Concurrent Collections
Được định nghĩa trong namespace System.Collections.Concurrent. Những collection này được thiết kế để hoạt động tốt trong môi trường đa luồng (multi-threading).
Các loại phổ biến:
- ConcurrentBag<T>: Hỗ trợ thêm/xóa các phần tử không có thứ tự cụ thể.
- ConcurrentDictionary<TKey, TValue>: Dictionary hỗ trợ thread-safe.
- BlockingCollection<T>: Được sử dụng để điều phối sản xuất và tiêu thụ trong các ứng dụng đa luồng.
4. Specialized Collections
Được định nghĩa trong namespace System.Collections.Specialized. Được sử dụng trong các trường hợp đặc biệt.
Các loại phổ biến:
- StringCollection: Một collection chỉ lưu trữ các chuỗi.
- NameValueCollection: Lưu trữ các cặp key-value nhưng hỗ trợ nhiều giá trị cho một key.
5. Immutable Collections
Được định nghĩa trong namespace System.Collections.Immutable. Các collection này không thể thay đổi sau khi được tạo ra, rất hữu ích trong các ứng dụng không cho phép chỉnh sửa dữ liệu (immutable).
Các loại phổ biến:
- ImmutableList<T>
- ImmutableDictionary<TKey, TValue>
- ImmutableArray<T>
So sánh Non-Generic và Generic
|
Tiêu chí |
Non-Generic |
Generic |
|
An toàn kiểu |
Không an toàn |
An toàn |
|
Hiệu suất |
Thấp hơn |
Cao hơn |
|
Kiểu dữ liệu |
Không yêu cầu cụ thể |
Phải xác định |
|
Tính phổ biến |
Ít phổ biến hơn |
Phổ biến hơn |
Khi nào nên dùng loại nào?
- Non-Generic: Khi cần làm việc với kiểu dữ liệu hỗn hợp (hiếm gặp).
- Generic: Nên ưu tiên sử dụng vì an toàn và hiệu suất cao.
- Concurrent: Khi làm việc trong môi trường đa luồng.
- Immutable: Khi cần đảm bảo tính bất biến của dữ liệu.
Bài tập 1:
Đề bài: Viết chương trình sử dụng Queue<T> để quản lý hàng đợi khách hàng tại ngân hàng.
Các chức năng:
- Thêm khách hàng mới vào hàng đợi.
- Gọi khách hàng tiếp theo.
- Hiển thị danh sách khách hàng trong hàng đợi.
Bài tập 2: Đảo ngược chuỗi bằng Stack
Đề bài: Viết chương trình sử dụng Stack để đảo ngược một chuỗi bất kỳ do người dùng nhập vào.
Ví dụ:
- Nhập: "Hello"
- Kết quả: "olleH"
Tham khảo: https://tedu.com.vn/lap-trinh-c/cnet-can-ban-hieu-biet-ve-cac-collection-trong-net-framework-90.html
Tác giả: Bạch Ngọc Toàn
Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.
Bài viết liên quan
Sử dụng kiểu tập hợp (Enum)
Enum (viết tắt của Enumeration) trong C# là một kiểu dữ liệu đặc biệt cho phép bạn định nghĩa một tập hợp các hằng số có tên
Đọc thêmTính đóng gói (Encapsulation) và best practices trong OOP
(Tính đóng gói) là một trong những nguyên tắc cơ bản của lập trình hướng đối tượng (OOP).
Đọc thêmTính trừu tượng - Abstract classes and interfaces
Tính trừu tượng (Abstraction) trong OOP là kỹ thuật ẩn đi các chi tiết triển khai và chỉ hiển thị cho người dùng những chức năng cần thiết.
Đọc thêmTính chất kế thừa (Inheritance) và đa hình (polymorphism)
Kế thừa là cơ chế cho phép một lớp (class) kế thừa các thuộc tính và phương thức từ một lớp khác.
Đọc thêmCách debug ứng dụng C#
Hướng dẫn cách debug chương trình C# trong Visual Studio và Visual Studio Code
Đọc thêmTổng quan về Generic và Non-Generic Collection
Hiểu khái niệm Generic và Non-Generic Collection và phân biệt giữa Generic Collection và Non-Generic Collection.
Đọc thêmSử dụng mảng (Arrays)
Mảng trong C# là một cấu trúc dữ liệu lưu trữ một dãy các phần tử có bộ nhớ nằm liên tiếp nhau và có kích thước cố đinh.
Đọc thêmLập trình hướng đối tượng
Lập trình hướng đối tượng (Object Oriented Programing) hay còn gọi là OOP. Là một kỹ thuật lập trình cho phép các lập trình viên có thể ánh xạ các thực thể bên ngoài đời thực và trừu tượng hoá thành các class và object trong mã nguồn.
Đọc thêmVòng lặp (loop)
Trong thực tế khi bạn cần thực thi một khối lệnh nhiều lần. Vòng lặp cho phép chúng ta thực thi một câu lệnh hoặc một khối lệnh nhiều lần.
Đọc thêmCấu trúc điều khiển Swicth case
C# cung cấp một cấu trúc khác để thực hiện rẽ nhiều nhánh thay cho việc lồng ghép nhiều if-else là cấu trúc switch-case.
Đọc thêm