Các lớp Collection là các lớp đặc biệt để lưu giữ và thu hồi dữ liệu. Những lớp này cung cấp sự hỗ trợ cho Stack, Queue, List, và Hash Table. Đa số các lớp Collection trong C# triển khai cùng các Interface.
Trong C#, các lớp Collection phục vụ các mục đích đa dạng, chẳng hạn như cấp phát bộ nhớ động cho các phần tử và truy cập một danh sách các item dựa trên một chỉ mục… Những lớp này tạo tập hợp các đối tượng của lớp Object, mà là lớp cơ sở cho tất cả kiểu dữ liệu trong C#.
Ghi chú: Stack: ngăn xếp, push: thêm nút mới vào đỉnh (top) stack, pop: thao tác lấy 1 phần tử từ đỉnh stack.
Nội dung chính của bài:
Các lớp Collection và cách sử dụng của chúng trong C#
Bảng dưới liệt kê các lớp được sử dụng phổ biến của System.Collection namespace.
Lớp | Mô tả và cách sử dụng |
ArrayList trong C# | Nó biểu diễn một tập hợp được sắp xếp của một đối tượng mà có thể được lập chỉ mục cho từng item riêng rẽ. Về cơ bản, nó là một sự thay thế cho một mảng. Tuy nhiên, không giống như trong mảng, bạn có thể thêm và gỡ bỏ các item từ một list tại một vị trí đã xác định bởi sử dụng một chỉ mục và mảng chính nó có thể tự điều chỉnh kích cỡ một cách tự động. Nó cũng cho phép cấp phát bộ nhớ động, thêm, tìm kiếm và sắp xếp các item trong một list. |
Hashtable trong C# | Nó sử dụng một cặp key-value để truy cập các phần tử trong collection này. Một Hash Table được sử dụng khi bạn cần truy cập các phần tử bởi sử dụng key, và bạn có thể nhận diện một giá trị key hữu ích. Mỗi item trong Hash Table có một cặp key/value. Key được sử dụng để truy cập các item trong dạng collection này. |
SortedList trong C# | Nó sử dụng một key cũng như một index để truy cập các item trong một list. Một danh sách đã được sắp xếp là sự tổ hợp của một mảng và một Hash Table. Nó chứa một danh sách các item mà có thể được truy cập bởi sử dụng một key hoặc một chỉ mục. Nếu bạn truy cập item bởi sử dụng một chỉ mục, nó là một ArrayList, và nếu bạn truy cập item bởi sử dụng key, nó là một HashTable. Tập hợp các item luôn luôn được sắp xếp bởi giá trị key |
Stack trong C# | Nó biểu diễn một tập hợp Last-in, First-out của các đối tượng. Nó được sử dụng khi bạn cần truy cập các item theo dạng Last-in, First-out. Khi bạn thêm một item vào trong danh sách, nó được gọi là pushing và khi bạn gỡ bỏ một item, nó được gọi là popping. |
Queue trong C# | Nó biểu diễn một tập hợp First-in, First-out của các đối tượng. Nó được sử dụng khi bạn cần truy cập các item theo dạng First-in, First-out. Khi bạn thêm một item vào trong danh sách, nó được gọi là enqueue và khi bạn gỡ bỏ một item, nó được gọi là deque. |
BitArray trong C# | Nó biểu diễn một mảng ở dạng biểu diễn nhị phân bởi sử dụng các giá trị 1 và 0. Nó được sử dụng khi bạn cần lưu giữ các Bit nhưng không biết trước số lượng Bit. Bạn có thể truy cập các item từ BitArray collection bởi sử dụng một chỉ mục là số nguyên, mà bắt đầu từ 0. |
ArrayList trong C#
ArrayList trong C# biểu diễn một tập hợp được sắp xếp của một đối tượng mà có thể được lập chỉ mục cho từng item riêng rẽ. Về cơ bản, nó là một sự thay thế cho một mảng. Tuy nhiên, không giống như trong mảng, bạn có thể thêm và gỡ bỏ các item từ một list tại một vị trí được chỉ định bằng cách sử dụng một chỉ mục và mảng tự động thay đổi kích thước. Nó cũng cho phép cấp phát bộ nhớ động, thêm, tìm kiếm và sắp xếp các item trong một list.
Phương thức và Thuộc tính của lớp ArrayList trong C#:
Dưới đây là các thuộc tính được sử dụng phổ biến của lớp ArrayList trong C#:
Thuộc tính | Mô tả |
---|---|
Capacity | Lấy hoặc thiết lập số phần tử mà ArrayList có thể chứa. |
Count | Lấy số phần tử thực sự được chứa trong ArrayList. |
IsFixedSize | Lấy một giá trị chỉ rằng có hay không ArrayList là có một kích cỡ cố định. |
IsReadOnly | Lấy một giá trị chỉ rằng có hay không ArrayList là read-only. |
Item | Lấy hoặc thiết lập phần tử tại chỉ mục đã xác định. |
Dưới đây là các phương thức được sử dụng phổ biến của lớp ArrayList trong C#:
- public virtual int Add(object value);: Thêm một đối tượng vào phần cuối của ArrayList.
- public virtual void AddRange(ICollection c);: Thêm các phần tử của một ICollection vào phần cuối của ArrayList.
- public virtual void Clear();: Gỡ bỏ các phần tử từ ArrayList đó.
- public virtual bool Contains(object item);: Xác định có hay không một phần tử là nằm trong ArrayList.
- public virtual ArrayList GetRange(int index, int count);: Trả về một ArrayList mà biểu diễn một tập con của các phần tử trong ArrayList nguồn.
- public virtual int IndexOf(object);: Trả về chỉ mục (dựa trên cơ sở 0) của lần xuất hiện đầu tiên của một giá trị trong ArrayList hoặc một phần của nó.
- public virtual void Insert(int index, object value);: Chèn một phần tử vào ArrayList tại chỉ mục đã xác định.
- public virtual void InsertRange(int index, ICollection c);: Chèn một phần tử của một collection vào ArrayList tại chỉ mục đã xác định.
- public virtual void Remove(object obj);: Gỡ bỏ lần xuất hiện đầu tiên của một đối tượng đã xác định tại chỉ mục đã xác định.
- public virtual void RemoveAt(int index);: Gỡ bỏ phần tử tại chỉ mục đã xác định của ArrayList.
- public virtual void RemoveRange(int index, int count);: Gỡ bỏ một dãy phần tử từ ArrayList.
- public virtual void Reverse();: Đảo ngược thứ tự phần tử trong ArrayList.
- public virtual void SetRange(int index, ICollection c);: Sao chép các phần tử của một collection qua một dãy các phần tử trong ArrayList.
- public virtual void Sort();: Sắp xếp các phần tử trong ArrayList.
- public virtual void TrimToSize();: Thiết lập capacity tới số phần tử thực sự trong ArrayList.
Ví dụ:
using System; using System.Collections; namespace QTMCsharp { class Tester { static void Main(string[] args) { Console.WriteLine("Ví dụ minh họa ArrayList trong C#"); Console.WriteLine("---------------------------------"); ArrayList al = new ArrayList(); Console.WriteLine("\nChèn một vài phần tử vào ArrayList: "); al.Add(50); al.Add(93); al.Add(85); al.Add(96); al.Add(82); al.Add(25); al.Add(90);
al.Add(99); Console.WriteLine("\nDung lượng của ArrayList: {0} ", al.Capacity); Console.WriteLine("Số phần tử trong ArrayList: {0}", al.Count); Console.WriteLine("\nHiển thị các phần tử có trong ArrayList: "); foreach (int i in al) { Console.Write(i + " "); } Console.WriteLine(); Console.WriteLine("\nSắp xếp ArrayList rồi in: "); al.Sort(); foreach (int i in al) { Console.Write(i + " "); } Console.WriteLine(); Console.ReadKey(); } } }
Khi chạy code trên bạn sẽ có kết quả như sau:
Ví dụ minh họa ArrayList trong C#
---------------------------------
Chèn một vài phần tử vào ArrayList:
Dung lượng của ArrayList: 8
Số phần tử trong ArrayList: 8
Hiển thị các phần tử có trong ArrayList:
50 93 85 96 82 25 90 99
Sắp xếp ArrayList rồi in:
25 50 82 85 90 93 96 99
Hashtable trong C#
Lớp Hashtable trong C# sử dụng một cặp key-value để truy cập đến các phần tử trong collection này. Hash Table được sử dụng khi bạn cần truy cập đến các phần tử bằng cách sử dụng key, và bạn có thể nhận diện một giá trị key hữu ích. Mỗi item trong Hash Table có một cặp key và value. Key được sử dụng để truy cập các item trong dạng collection này.
Phương thức và đặc tính của lớp Hashtable trong C#:
Bảng dưới liệt kê những đặc tính được sử dụng phổ biến của lớp Hashtable trong C#:
Thuộc tính | Mô tả |
---|---|
Count | Lấy số cặp key và value được chứa trong Hashtable. |
IsFixedSize | Lấy một giá trị chỉ rằng có hay không Hashtable là có một kích cỡ cố định. |
IsReadOnly | Lấy một giá trị chỉ rằng có hay không Hashtable là read-only. |
Item | Lấy hoặc thiết lập giá trị được liên kết với key đã xác định. |
Keys | Lấy một ICollection chứa các key trong Hashtable. |
Values | Lấy một ICollection chứa các value trong Hashtable. |
Danh sách các phương thức được sử dụng phổ biến của lớp Hashtabletrong C#:
- public virtual void Add(object key, object value); Thêm một phần tử với key và value đã xác định vào trong Hashtable.
- public virtual void Clear(); Gỡ bỏ tất cả phần tử từ Hashtable.
- public virtual bool ContainsKey(object key); Xác định có hay không Hashtable là chứa một key cụ thể.
- public virtual bool ContainsValue(object value); Xác định có hay không Hashtable là chứa một value cụ thể.
- public virtual void Remove(object key); Gỡ bỏ phần tử với key đã xác định từ Hashtable.
Ví dụ về Hashtable trong C#:
using System; using System.Collections; namespace QTMCSharp { class Tester { static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("001", "Hoàng Anh"); ht.Add("002", "Ngọc Anh"); ht.Add("003", "Mai Anh"); ht.Add("004", "Trâm Anh"); ht.Add("005", "Thế Anh"); ht.Add("006", "Lan Anh"); ht.Add("007", "Minh Anh"); ht.Add("008", "Linh Anh");
if (ht.ContainsValue("Ngân Anh")) { Console.WriteLine("Tên học sinh này đã có trong danh sách"); } else { ht.Add("009", "Ngân Anh"); } // Lấy tập hợp các key. ICollection key = ht.Keys; foreach (string k in key) { Console.WriteLine(k + ": " + ht[k]); } Console.ReadKey(); } } }
Chạy chương trình trên bạn sẽ nhận được kết quả như sau:
007: Minh Anh
004: Trâm Anh
005: Thế Anh
008: Linh Anh
009: Ngân Anh
002: Ngọc Anh
003: Mai Anh
001: Hoàng Anh
006: Lan Anh
SortedList trong C#
Lớp SortedList trong C# sử dụng một key cũng như một chỉ mục để truy cập các item trong một list.
Một danh sách đã được sắp xếp là sự tổ hợp của một mảng và một Hash Table. Nó chứa một danh sách các item có thể được truy cập bằng cách sử dụng một key hoặc một chỉ mục. Nếu bạn truy cập item bằng chỉ mục, nó là một ArrayList, và nếu bạn truy cập item bằng key, nó là một HashTable. Tập hợp các item luôn luôn được sắp xếp theo giá trị key.
Phương thức và đặc tính của lớp SortedList trong C#:
Đây là các đặc tính được sử dụng phổ biến của lớp SortedList trong C#:
- Capacity: Lấy hoặc thiết lập dung lượng của SortedList.
- Count: Lấy số phần tử được chứa trong SortedList.
- IsFixedSize: Lấy một giá trị chỉ dẫn có hay không SortedList là có kích cỡ cố định.
- IsReadOnly: Lấy một giá trị chỉ dẫn có hay không SortedList là read-only.
- Item: Lấy và thiết lập giá trị được liên kết với một key cụ thể trong SortedList.
- Keys: Lấy các key trong SortedList.
- Values: Lấy các value trong SortedList.
Những phương thức được sử dụng phổ biến của lớp SortedList trong C#:
- public virtual void Add(object key, object value); Thêm một phần tử với key và value đã xác định vào trong SortedList.
- public virtual void Clear(); Gỡ bỏ tất cả phần tử từ SortedList.
- public virtual bool ContainsKey(object key); Xác định có hay không SortedList là chứa một key cụ thể.
- public virtual bool ContainsValue(object value); Xác định có hay không SortedList là chứa một value cụ thể.
- public virtual object GetByIndex(int index); Lấy value tại chỉ mục đã xác định của SortedList.
- public virtual object GetKey(int index); Lấy key tại chỉ mục đã xác định của SortedList.
- public virtual IList GetKeyList(); Lấy các key trong SortedList.
- public virtual IList GetValueList(); Lấy các value trong SortedList.
- public virtual int IndexOfKey(object key); Trả về chỉ mục (dựa trên cơ sở 0) của key đã xác định trong SortedList.
- public virtual int IndexOfValue(object value); Trả về chỉ mục (dựa trên cơ sở 0) của lần xuất hiện đầu tiên của value đã xác định trong SortedList.
- public virtual void Remove(object key); Gỡ bỏ phần tử với key đã xác định từ SortedList.
- public virtual void RemoveAt(int index); Gỡ bỏ phần tử tại chỉ mục đã xác định của SortedList.
- public virtual void TrimToSize(); Thiết lập capacity tới số phần tử thực sự trong SortedList.
Ví dụ về SortedList trong C#:
using System; using System.Collections; namespace CollectionsApplication { class Program { static void Main(string[] args) { SortedList sl = new SortedList(); sl.Add("001", "Hoàng Anh"); sl.Add("002", "Ngọc Anh"); sl.Add("003", "Mai Anh"); sl.Add("004", "Trâm Anh"); sl.Add("005", "Thế Anh"); sl.Add("006", "Lan Anh"); sl.Add("007", "Minh Anh"); sl.Add("008", "Linh Anh");
if (sl.ContainsValue("Ngân Anh")) { Console.WriteLine("Tên học sinh này đã có trong danh sách"); } else { sl.Add("009", "Ngân Anh"); } // Lấy tập hợp các key. ICollection key = sl.Keys; foreach (string k in key) { Console.WriteLine(k + ": " + sl[k]); } } } }
Chạy code trên ta nhận được kết quả:
001: Hoàng Anh
002: Ngọc Anh
003: Mai Anh
004: Trâm Anh
005: Thế Anh
006: Lan Anh
007: Minh Anh
008: Linh Anh
009: Ngân Anh
Stack trong C#
Lớp Stack trong C# biểu diễn một tập hợp Last-in, First-out của các đối tượng. Nó được sử dụng khi bạn cần truy cập các item theo dạng Last-in, First-out. Khi bạn thêm một item vào trong danh sách, nó được gọi là pushing và khi bạn gỡ bỏ một item, nó được gọi là popping.
Phương thức và đặc tính của lớp Stack trong C#:
Đặc tính của Stack trong C#:
- Count: Lấy số phần tử có trong Stack.
Những phương thức được sử dụng phổ biến của lớp Stack trong C#:
- public virtual void Clear(); Gỡ bỏ tất cả phần tử từ Stack.
- public virtual bool Contains(object obj); Gỡ bỏ tất cả phần tử từ Stack.
- public virtual object Peek(); Trả về một đối tượng tại trên cùng của Stack mà không gỡ bỏ nó.
- public virtual object Pop(); Gỡ bỏ và trả về đối tượng tại trên cùng của Stack.
- public virtual void Push(object obj); Chèn một object tại trên cùng của Stack.
- public virtual object[] ToArray(); Sao chép Stack tới một mảng mới.
Ví dụ về Stack trong C#:
using System; using System.Collections; namespace CollectionsApplication { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push('M'); st.Push('T'); st.Push('Q'); st.Push('W'); Console.WriteLine("1 - Stack hiện tại: "); foreach (char c in st) { Console.Write(c + " "); } Console.WriteLine(); st.Push('V'); st.Push('H'); Console.WriteLine("Giá trị có thể pop tiếp theo trong stack: {0}", st.Peek()); Console.WriteLine("2 - Stack hiện tại: "); foreach (char c in st) { Console.Write(c + " "); } Console.WriteLine(); Console.WriteLine("Xóa các giá trị."); st.Pop(); st.Pop(); st.Pop(); Console.WriteLine("3 - Stack hiện tại: "); foreach (char c in st) { Console.Write(c + " "); } } } }
Kết quả khi chạy đoạn code trên:
1 - Stack hiện tại:
W Q T M
Giá trị có thể pop tiếp theo trong stack: H
2 - Stack hiện tại:
H V W Q T M
Xóa các giá trị.
3 - Stack hiện tại:
Q T M
Queue trong C#
Lớp Queue trong C# biểu diễn một tập hợp First-in, First-out của các đối tượng. Nó được sử dụng khi bạn cần truy cập các item theo dạng First-in, First-out. Khi bạn thêm một item vào trong danh sách, nó được gọi là enqueue và khi bạn gỡ bỏ một item, nó được gọi là deque.
Phương thức và đặc tính của lớp Queue trong C#:
Đặc tính được sử dụng phổ biến của lớp Queue trong C# là count, nó lấy số phần tử có trong queue.
Những phương thức được sử dụng phổ biến của lớp Queue trong C# bao gồm:
- public virtual void Clear(); Gỡ bỏ tất cả phần tử từ Queue.
- public virtual bool Contains(object obj); Xác định có hay không một phần tử là trong Queue.
- public virtual object Dequeue(); Gỡ bỏ và trả về đối tượng tại phần bắt đầu của Queue.
- public virtual void Enqueue(object obj); Thêm một phần tử vào phần cuối của Queue.
- public virtual object[] ToArray(); Sao chép Queue tới một mảng mới.
- public virtual void TrimToSize(); Thiết lập capacity tới số phần tử thực sự trong Queue.
Ví dụ về Queue trong C#:
using System; using System.Collections; namespace CollectionsApplication { class Program { static void Main(string[] args) { Queue q = new Queue(); q.Enqueue('Q'); q.Enqueue('T'); q.Enqueue('M'); q.Enqueue('W'); Console.WriteLine("1 - Queue hiện tại: "); foreach (char c in q) Console.Write(c + " "); Console.WriteLine(); q.Enqueue('V'); q.Enqueue('H'); Console.WriteLine("2 - Queue hiện tại: "); foreach (char c in q) Console.Write(c + " "); Console.WriteLine(); Console.WriteLine("Xóa vài giá trị!"); char ch = (char)q.Dequeue(); Console.WriteLine("Giá trị đã xóa: {0}", ch); ch = (char)q.Dequeue(); Console.WriteLine("Giá trị đã xóa: {0}", ch); Console.ReadKey(); } } }
Kết quả khi chạy code trên sẽ là:
1 - Queue hiện tại:
Q T M W
2 - Queue hiện tại:
Q T M W V H
Xóa vài giá trị!
Giá trị đã xóa: Q
Giá trị đã xóa: T
BitArray trong C#
Lớp BitArray trong C# quản lý một mảng nhỏ các giá trị bit, được biểu diễn dưới dạng nhị phân, với true là bit được bật (1) và false cho biết bit bị tắt (0). Nó được sử dụng khi bạn cần lưu trữ các Bit nhưng không biết trước số lượng Bit. Bạn có thể truy cập các item từ tập hợp BitArray bằng cách sử dụng một chỉ mục là số nguyên, bắt đầu từ 0.
Phương thức và Thuộc tính của lớp BitArray trong C#:
Danh sách các đặc tính được sử dụng phổ biến của lớp BitArray trong C#:
- Count: Lấy số phần tử được chứa trong BitArray.
- IsReadOnly: Lấy một giá trị chỉ rằng có hay không BitArray là read-only.
- Item: Lấy hoặc thiết lập giá trị của bit tại vị trí đã xác định trong BitArray.
- Length: Lấy hoặc thiết lập số phần tử trong BitArray.
Bảng dưới liệt kê các phương thức được sử dụng phổ biến của lớp BitArray trong C#:
- public BitArray And(BitArray value); Thực hiện hoạt động bitwise AND trên các phần tử trong BitArray hiện tại với các phần tử tương ứng trong BitArray đã xác định.
- public bool Get(int index); Lấy giá trị của bit tại một vị trí đã xác định trong BitArray.
- public BitArray Not(); Đảo ngược tất cả giá trị bit trong BitArray hiện tại, để mà các phần tử được thiết lập là true được chuyển đổi thành false, và các phần tử được thiết lập là false được chuyển đổi thành true.
- public BitArray Or(BitArray value); Thực hiện hoạt động bitwise OR trên các phần tử trong BitArray hiện tại với các phần tử tương ứng trong BitArray đã xác định.
- public void Set(int index, bool value); Thiết lập bit tại một vị trí đã xác định trong BitArray tới value đã cho.
- public void SetAll(bool value); Thiết lập tất cả bit trong BitArray tới value đã cho.
- public BitArray Xor(BitArray value); Thực hiện hoạt động bitwise Exclusive OR trên các phần tử trong BitArray hiện tại với các phần tử tương ứng trong BitArray đã xác định.
Ví dụ về BitArray trong C#:
using System; using System.Collections; namespace Quantrimangcom { class Program { static void Main(string[] args) { //Tạo 2 mảng bit có kích thước là 8 BitArray ba1 = new BitArray(8); BitArray ba2 = new BitArray(8); byte[] a = { 60 }; byte[] b = { 13 }; //Lưu trữ giá trị 60 và 13 trong các mảng ba1 = new BitArray(a); ba2 = new BitArray(b); //Hiển thị nội dung của mảng ba1 Console.WriteLine("Phần tử của Bit Array ba1: 60"); for (int i = 0; i < ba1.Count; i++) { Console.Write("{0, -6} ", ba1[i]); } Console.WriteLine(); //Hiển thị nội dung của mảng ba2 Console.WriteLine("Phần tử của Bit Array ba2: 13"); for (int i = 0; i < ba2.Count; i++) { Console.Write("{0, -6} ", ba2[i]); } Console.WriteLine(); BitArray ba3 = new BitArray(8); ba3 = ba1.And(ba2); //Hiển thị nội dung của mảng ba3 Console.WriteLine("Bit Array ba3 sau khi thực hiện AND: 12"); for (int i = 0; i < ba3.Count; i++) { Console.Write("{0, -6} ", ba3[i]); } Console.WriteLine(); ba3 = ba1.Or(ba2); //content of ba3 Console.WriteLine("Bit Array ba3 sau khi thực hiện OR: 61"); for (int i = 0; i < ba3.Count; i++) { Console.Write("{0, -6} ", ba3[i]); } Console.WriteLine(); Console.ReadKey(); } } }
Sau khi chạy code trên ta được:
Phần tử của Bit Array ba1: 60
False False True True True True False False
Phần tử của Bit Array ba2: 13
True False True True False False False False
Bit Array ba3 sau khi thực hiện AND: 12
False False True True False False False False
Bit Array ba3 sau khi thực hiện OR: 61
True False True True False False False False
Theo Tutorialspoint
Bài trước: Sự kiện (Event) trong C#
Bài tiếp: Generic trong C#