Bảng băm C# với các ví dụ
⚡ Tóm tắt thông minh
Hashtable trong C# là một tập hợp từ không gian tên System.Collections lưu trữ dữ liệu dưới dạng các cặp khóa-giá trị, trong đó mỗi khóa duy nhất ánh xạ tới một giá trị và khóa đó cho phép tra cứu nhanh chóng giá trị được lưu trữ.

Hashtable trong C# là gì?
Bảng băm là một bộ sưu tập đặc biệt được sử dụng để lưu trữ các mục khóa-giá trị. Vì vậy, thay vì chỉ lưu trữ một giá trị như ngăn xếp, danh sách mảng và hàng đợi, bảng băm lưu trữ 2 giá trị. 2 giá trị này tạo thành một phần tử của bảng băm.
Dưới đây là một số ví dụ về cách các giá trị của bảng băm trông như thế nào.
{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }
Ở trên chúng ta có 3 cặp giá trị chính. Các khóa của mỗi phần tử lần lượt là 001, 002 và 003. Giá trị của mỗi cặp giá trị khóa là “Net.“, “C#” và “ASP.Net” tương ứng.
Hãy xem xét các hoạt động có sẵn cho bộ sưu tập Hashtable một cách chi tiết hơn.
Tuyên bố của Hashtable
Việc khai báo Hashtable được hiển thị bên dưới. Hashtable được tạo với sự trợ giúp của Kiểu dữ liệu Hashtable. Từ khóa “mới” được sử dụng để tạo đối tượng của Hashtable. Đối tượng sau đó được gán cho biến ht.
Hashtable ht = new Hashtable()
Thêm các phần tử vào Hashtable
Phương thức Add được sử dụng để thêm một phần tử vào hàng đợi. Cú pháp chung của câu lệnh được đưa ra dưới đây
HashTable.add("key","value")
Ví dụ 1:
Hãy nhớ rằng mỗi phần tử của bảng băm bao gồm 2 giá trị, một là khóa và một là giá trị.
Bây giờ, hãy xem điều này hoạt động ở cấp độ mã. Tất cả mã được đề cập bên dưới sẽ được ghi vào ứng dụng Console của chúng tôi.
Mã sẽ được ghi vào tệp Program.cs của chúng tôi. Trong chương trình bên dưới, chúng ta sẽ viết mã để xem cách chúng ta có thể sử dụng các phương pháp nêu trên.
Bây giờ, trong ví dụ của chúng ta, chúng ta sẽ chỉ xem cách chúng ta có thể tạo một hashtable, thêm các phần tử vào hashtable và hiển thị chúng cho phù hợp.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DemoApplication { class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("001",".Net"); ht.Add("002","C#"); ht.Add("003","ASP.Net"); ICollection keys = ht.Keys; foreach (String k in keys) { Console.WriteLine(ht[k]); } Console.ReadKey(); } } }
Code Giải trình:-
- Đầu tiên, chúng ta khai báo biến có thể băm bằng cách sử dụng kiểu dữ liệu Hashtable bằng từ khóa “Mới”. Tên của biến được xác định là 'ht'.
- Sau đó, chúng tôi thêm các phần tử vào bảng băm bằng phương thức Thêm. Hãy nhớ rằng chúng ta cần thêm cả phần tử khóa và giá trị khi thêm thứ gì đó vào bảng băm.
- Không có cách nào trực tiếp để hiển thị các phần tử của bảng băm.
- Để hiển thị hashtable, trước tiên chúng ta cần lấy danh sách các khóa (001, 002 và 003) từ bảng băm.
- Điều này được thực hiện thông qua giao diện ICollection. Đây là loại dữ liệu đặc biệt có thể được sử dụng để lưu trữ khóa của bộ sưu tập có thể băm. Sau đó, chúng tôi gán các khóa của bộ sưu tập có thể băm cho biến 'khóa'.
- Tiếp theo, đối với mỗi giá trị khóa, chúng ta nhận được giá trị liên quan trong bảng băm bằng cách sử dụng câu lệnh ht[k].
Nếu mã trên được nhập đúng và chương trình được chạy thì kết quả sau sẽ được hiển thị.
Đầu ra:
Hãy xem xét thêm một số phương pháp có sẵn cho bảng băm.
Chứa khóa
Phương thức này được sử dụng để xem liệu khóa có trong Hashtable hay không. Dưới đây là cú pháp chung của câu lệnh này. Câu lệnh sẽ trả về true nếu khóa tồn tại, nếu không nó sẽ trả về giá trị false.
Hashtable.Containskey(key)
Chứa giá trị
Phương thức này được sử dụng để xem liệu Giá trị có xuất hiện trong Hashtable hay không. Dưới đây là cú pháp chung của câu lệnh này. Câu lệnh sẽ trả về true nếu Giá trị tồn tại, nếu không nó sẽ trả về giá trị sai.
Hashtable.ContainsValue(value)
Ví dụ 2:
Hãy thay đổi mã trong Ứng dụng giao diện điều khiển để giới thiệu cách chúng tôi có thể sử dụng phương thức “Containskey” và “ContainsValue”.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DemoApplication { class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("001",".Net"); ht.Add("002","C#"); ht.Add("003","ASP.Net"); Console.WriteLine(ht.ContainsKey("001")); Console.WriteLine(ht.ContainsValue("C#")); Console.ReadKey(); } } }
Code Giải trình:-
- Đầu tiên, chúng tôi sử dụng phương thức ChứaKey để xem liệu khóa có trong bảng băm hay không. Phương thức này sẽ trả về true nếu khóa có trong bảng băm. Phương thức này sẽ trả về true vì khóa tồn tại trong bảng băm.
- Sau đó, chúng tôi sử dụng phương thức ChứaValue để xem liệu giá trị có trong bảng băm hay không. Phương thức này sẽ trả về 'true' vì Giá trị tồn tại trong bảng băm.
Nếu mã trên được nhập đúng và chương trình được chạy thì kết quả sau sẽ được hiển thị.
Đầu ra:
Từ kết quả đầu ra, bạn có thể thấy rõ rằng cả khóa và giá trị đang được tìm kiếm đều có trong bảng băm.
Cách lặp qua một bảng băm trong C#
Các ví dụ trên đọc giá trị thông qua tập hợp Keys, nhưng có thể duyệt qua Hashtable theo cách gọn gàng hơn. Một vòng lặp foreach trên DictionaryEntry sẽ cung cấp cho bạn khóa và giá trị của mọi phần tử cùng nhau trong một lần duyệt duy nhất, đây là cách phổ biến nhất để đọc Hashtable.
Bước 1) Tạo một Hashtable và thêm ba cặp khóa-giá trị vào đó.
Bước 2) Lặp qua Hashtable với một biến DictionaryEntry, sau đó đọc các thuộc tính Key và Value của từng mục.
using System; using System.Collections; namespace DemoApplication { class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("101", "Java"); ht.Add("102", "Python"); ht.Add("103", "Kotlin"); foreach (DictionaryEntry entry in ht) { Console.WriteLine(entry.Key + " - " + entry.Value); } Console.ReadKey(); } } }
Code Giải trình:-
- Một Hashtable có tên ht được tạo ra, và ba cặp khóa-giá trị được chèn vào bằng phương thức Add.
- Vòng lặp foreach gán mỗi phần tử cho một DictionaryEntry, trong đó các thuộc tính Key và Value hiển thị hai nửa của cặp.
Khi chương trình chạy, nó sẽ in từng phím bên cạnh giá trị của phím đó, ví dụ như 101 – JavaVì Hashtable không giữ nguyên thứ tự chèn, các cặp phần tử có thể xuất hiện theo thứ tự khác với thứ tự chúng được thêm vào. Để chỉ đọc các khóa, hãy lặp qua tập hợp Keys, và để chỉ đọc các giá trị, hãy lặp qua tập hợp Values.
Các phương thức và thuộc tính của Hashtable trong C#
Lớp Hashtable cung cấp một tập hợp nhỏ các phương thức và thuộc tính bao gồm hầu hết mọi tác vụ bạn cần, từ thêm và xóa các cặp đến kiểm tra sự tồn tại và đếm số phần tử. Các thành viên hữu ích nhất được liệt kê bên dưới.
| Thành viên | Kiểu | Mô tả Chi tiết |
|---|---|---|
| Thêm (khóa, giá trị) | Phương pháp | Chèn một cặp khóa và giá trị mới; khóa phải là duy nhất. |
| Xóa (khóa) | Phương pháp | Xóa phần tử khớp với khóa được chỉ định. |
| Thông thoáng() | Phương pháp | Xóa mọi cặp khóa-giá trị khỏi Hashtable. |
| Chứa Khóa(khóa) | Phương pháp | Trả về true khi khóa được cung cấp tồn tại. |
| Chứa giá trị (giá trị) | Phương pháp | Trả về true khi giá trị được cung cấp tồn tại. |
| Đếm | Bất động sản | Lấy số lượng cặp khóa-giá trị được lưu trữ. |
| Phím | Bất động sản | Trả về một tập hợp tất cả các khóa. |
| Các giá trị | Bất động sản | Trả về một tập hợp tất cả các giá trị. |
Vì mỗi khóa đều được băm, ContainsKey và bộ lập chỉ mục tìm thấy một phần tử trong thời gian gần như không đổi, đó là lý do tại sao Hashtable lại hữu ích cho việc tra cứu nhanh.
Sự khác biệt giữa Hashtable và Dictionary trong C#
Cả Hashtable và Dictionary đều lưu trữ các cặp khóa-giá trị, và cả hai đều thuộc họ rộng hơn của C#. bộ sưu tậpSự khác biệt quan trọng nằm ở tính an toàn kiểu dữ liệu, và sự khác biệt đó quyết định bạn nên sử dụng kiểu nào trong đoạn mã mới.
- Loại an toàn: Hashtable lưu trữ mọi cặp khóa và giá trị dưới dạng đối tượng, trong khi Dictionary thì khác. Vì nó là kiểu dữ liệu chung, nên trình biên dịch sẽ kiểm tra các kiểu dữ liệu bạn sử dụng.
- Không gian tên: Hashtable nằm trong System.Collections, trong khi Dictionary nằm trong System.Collections.Generic.
- BoxNS: Hashtable đóng gói các kiểu dữ liệu như int, nhưng Dictionary thông thường lưu trữ chúng trực tiếp và tránh được chi phí đó.
- Hiệu suất: Dictionary thường nhanh hơn vì nó không cần phải ép kiểu ngược lại từ object khi đọc giá trị.
- An toàn chủ đề: Hashtable cung cấp SyncConcurrentDictionary là một lớp bao bọc đồng bộ cho một tác giả có nhiều tác giả đọc, trong khi mã xử lý đồng thời thường chọn ConcurrentDictionary.
Đối với bất kỳ dự án mới nào, Dictionary thông thường là lựa chọn được khuyến nghị, còn Hashtable không thông thường chủ yếu xuất hiện trong các đoạn mã cũ.




