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ữ.

  • 📚 Các cặp khóa-giá trị: Hashtable lưu trữ hai giá trị cho mỗi phần tử, một khóa và giá trị tương ứng, thay vì chỉ một giá trị duy nhất như trong ngăn xếp hoặc danh sách mảng.
  • Thêm các phần tử: Phương thức Add chèn một khóa và một giá trị cùng nhau, và mọi khóa bên trong Hashtable phải là duy nhất.
  • 👀 ContainsKey và ContainsValue: Các phương thức này trả về true hoặc false, cho phép bạn kiểm tra xem một khóa hoặc một giá trị đã tồn tại hay chưa.
  • 🔁 Đọc các giá trị: Thuộc tính Keys với ICollection hoặc vòng lặp DictionaryEntry cho phép bạn đọc từng giá trị được lưu trữ một cách tuần tự.
  • 🛠️ Phương pháp và đặc tính: Các thao tác Remove, Clear, Count, Keys và Values ​​quản lý và kiểm tra nội dung của Hashtable.
  • 🤖 Hỗ trợ AI: GitHub Copilot tạo mã mẫu cho Hashtable, trong khi C# và ML.NET hiện đại lại ưu tiên Dictionary chung cho dữ liệu cặp khóa-giá trị an toàn về kiểu dữ liệu.

Bảng băm C#

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.

Bảng băm trong C#

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:-

  1. Đầ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'.
  2. 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.
  3. 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'.
  4. 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:

Bảng băm trong C#

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”.

Bảng băm trong C#

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:-

  1. Đầ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.
  2. 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:

Bảng băm trong C#

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:-

  1. 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.
  2. 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ũ.

Câu Hỏi Thường Gặp

Phương thức Remove xóa phần tử có khóa được chỉ định và giảm Count đi một. Nếu khóa không tồn tại, sẽ không có gì xảy ra, vì vậy hãy gọi ContainsKey trước khi gọi phương thức này nếu bạn cần chắc chắn rằng khóa đó có mặt.

Không. Mỗi khóa trong Hashtable phải là duy nhất. Gọi hàm Add với một khóa đã tồn tại sẽ gây ra lỗi ArgumentException. Tuy nhiên, bạn có thể lưu trữ cùng một giá trị dưới nhiều khóa khác nhau mà không gặp lỗi.

Hashtable hỗ trợ một người ghi với nhiều người đọc một cách an toàn. Đối với nhiều luồng ghi, hãy sử dụng Hashtable để bao bọc chúng.SyncBạn có thể chọn đồng bộ hóa, hoặc ưu tiên sử dụng ConcurrentDictionary từ System.Collections.Concurrent, lớp này xử lý các thao tác đọc và ghi đồng thời mà không cần khóa bên ngoài.

Tra cứu giá trị bằng khóa chạy trong thời gian gần như không đổi O(1) trung bình, vì khóa được băm để tìm nhóm của nó. Va chạm băm lớn có thể làm chậm nó, nhưng điều đó hiếm khi xảy ra với các khóa được phân phối tốt.

Giá trị có thể là null, nhưng khóa thì không. Việc truyền khóa null cho phương thức Add hoặc trình lập chỉ mục sẽ gây ra ngoại lệ ArgumentNullException. Mỗi khóa cũng phải là duy nhất và không được thay đổi trong khi được lưu trữ.

Một Hashtable không giữ thứ tự nào, vì vậy không thể sắp xếp tại chỗ. Sao chép các khóa của nó vào một danh sách hoặc ArrayList, sắp xếp danh sách đó, sau đó đọc các giá trị theo khóa. Một SortedList tự động giữ các phần tử của nó theo thứ tự.

Đúng vậy. GitHub Copilot viết các khai báo Hashtable, các lệnh Add và các vòng lặp DictionaryEntry từ một đoạn chú thích ngắn hoặc tên phương thức. Nó thường đề xuất sử dụng Dictionary chung chung hơn, vì đó là kiểu dữ liệu được khuyến nghị cho mã C# mới.

Dữ liệu huấn luyện của ML.NET được xử lý thông qua các tập hợp có kiểu dữ liệu cụ thể và pipeline IDataView thay vì Hashtable. Tuy nhiên, các bản đồ cặp khóa-giá trị dựa trên hàm băm vẫn hỗ trợ tra cứu đặc trưng, ​​mã hóa từ vựng và bộ nhớ đệm xung quanh mô hình học máy.

Tóm tắt bài viết này với: