Các tập hợp non-generic và generic trong C# có mối quan hệ tương ứng như sau:
ArrayList tương ứng với List
HashTable tương ứng với Dictionary
Queue tương ứng với Queue
Stack tương ứng với Stack
SortedList tương ứng với SortedList
Bài viết được tham khảo từ nguồn khác.
So sánh ArrayList (non-generic) và List (generic)
ArrayList là phiên bản phức tạp hơn của mảng. Lớp ArrayList cung cấp một số chức năng mà phần lớn các lớp Collections đều có nhưng không tồn tại trong lớp Array:
- Mảng có kích thước cố định, trong khi ArrayList tự động mở rộng theo nhu cầu.
- ArrayList cho phép thêm, chèn hoặc xóa nhiều phần tử cùng lúc, điều này không thể thực hiện dễ dàng với mảng.
- Có thể tạo phiên bản đồng bộ của ArrayList bằng cách sử dụng phương thức Synchronized.
- ArrayList cung cấp khả năng bọc chỉ đọc hoặc có kích thước cố định, trong khi mảng không hỗ trợ tính năng này.
- Mảng có một số ưu điểm mà ArrayList không có:
- Giới hạn dưới của mảng có thể đặt tùy ý, trong khi ArrayList luôn bắt đầu từ 0.
- Mảng có thể đa chiều, còn ArrayList chỉ có một chiều.
- Hiệu suất của mảng với kiểu dữ liệu cụ thể tốt hơn so với ArrayList do không cần boxing/unboxing.
Ví dụ về ArrayList:
ArrayList arrayList = new ArrayList();
arrayList.Add("a");
arrayList.Add(1);
arrayList.Add("b");
Console.WriteLine(arrayList[1]);
Ví dụ về mảng (Array):
Array array = Array.CreateInstance(typeof(string), 6);
array.SetValue("a", 0);
array.SetValue("b", 1);
Console.WriteLine(array.GetValue(1));
Tập hợp List<T>
List<T> là một tập hợp generic, mang lại tính an toàn kiểu dữ liệu và hiệu suất tốt hơn so với ArrayList. Ví dụ:
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
foreach (var number in numbers)
{
Console.WriteLine(number);
}
So sánh giữa List<T> và ArrayList:
- List<T> yêu cầu khai báo kiểu dữ liệu cụ thể, trong khi ArrayList chấp nhận mọi kiểu dữ liệu.
- List<T> không yêu cầu boxing/unboxing khi làm việc với kiểu giá trị.
Hashtable (non-generic) và Dictionary<K,V> (generic)
Hashtable và Dictionary<K,V> đều dùng để lưu trữ cặp key-value. Tuy nhiên:
- Dictionary<K,V> phù hợp hơn cho chương trình đơn luồng nhờ vào hiệu suất cao hơn.
- Hashtable mặc định cho phép nhiều luồng đọc và một luồng viết, trong khi Dictionary không an toàn với nhiều luồng.
Ví dụ về Hashtable:
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "A");
hashtable.Add(2, "B");
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
}
Ví dụ về Dictionary:
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "a");
dictionary.Add(2, "b");
foreach (var pair in dictionary)
{
Console.WriteLine($"Key: {pair.Key}, Value: {pair.Value}");
}
Queue và Stack
Queue hoạt động theo nguyên tắc FIFO (First In First Out), trong khi Stack hoạt động theo nguyên tắc LIFO (Last In First Out).
Ví dụ về Queue:
Queue queue = new Queue();
for (int i = 0; i < 5; i++)
{
queue.Enqueue(i);
}
while (queue.Count > 0)
{
Console.WriteLine(queue.Dequeue());
}
Ví dụ về Stack:
Stack stack = new Stack();
for (int i = 0; i < 5; i++)
{
stack.Push(i);
}
while (stack.Count > 0)
{
Console.WriteLine(stack.Pop());
}
SortedList
SortedList là một tập hợp các cặp key-value được sắp xếp theo key. Ví dụ:
SortedList sortedList = new SortedList();
sortedList.Add("apple", 1);
sortedList.Add("banana", 2);
foreach (DictionaryEntry entry in sortedList)
{
Console.WriteLine($"{entry.Key}: {entry.Value}");
}