C# - C Sharp: Hashtable

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Giới thiệu

Bạn đang ở một khác sạn, bạn có việc bận cần ra ngoài, bạn khóa cửa phòng và chìa khóa bạn gửi ở quầy lễ tân; những vị khách khác khi ra ngoài cũng gửi chìa ở quầy lễ tân. Ở đây mỗi chìa khóa sẽ là một giá trị nhận diện duy nhất cho một phòng của khách sạn, hay có nghĩa mỗi phòng của khách sạn sẽ được nhận diện chỉ bởi một chìa khóa.

hashtable-csharp

Lớp Hashtable (bảng băm) trong C# cũng có ý nghĩa tương tự như khách sạn, trong hashtable chứa các value (các phòng) và mỗi value sẽ có duy nhất một key (chìa khóa) nhận diện, và việc truy cập đến các value (giá trị) của bảng băm sẽ thông qua các key. Như vậy, khi chèn một phần tử vào hashtable thì nó sẽ bao gồm cặp key/value. Hashtable sử dụng kỹ thuật 'băm' để truy xuất các value tương ứng với key, theo đó thao tác băm sẽ tạo ra được mã băm cho key và mã băm đó sẽ được dùng để nhận diện value tương ứng của key.

Khi bạn tìm value thông qua key thì mã băm sẽ được sử dụng để định vị bản ghi mong muốn, ví dụ như tên của sinh viên có thể được sử dụng như một key để truy xuất tới id và địa chỉ nơi cư trú tương ứng của sinh viên đó.

Lớp Hashtable cung cấp các phương thức cũng như các thuộc tính dùng để thêm cũng như thao tác với dữ liệu trong bảng băm. Dưới đây sẽ trình bày chi tiết các phương thức của như thuộc tính của lớp Hashtable.

Lớp Hashtable thuộc namespace: System.Collections. Để tạo một bảng băm có tên objTable, ta làm như sau:

Hashtable objTable = new Hashtable();

Các phương thức của lớp Hashtable

1. Add()

Phương thức này dùng để thêm phần tử vào bảng băm, phần tử thêm vào sẽ có hai giá trị theo cặp key/value, trong đó key phải là duy nhất (không trùng với những key đã có trước đó), nếu không trình dịch sẽ báo lỗi runtime.

Cú pháp:

hashtable_name.Add(key, value);

Ví dụ:

objTable.Add(001, "John");
objTable.Add(002, "Peter");
objTable.Add(003, "James");
objTable.Add(004, "Joe");

2. Remove()

Phương thức này dùng để xóa phần tử có key được chỉ ra tương ứng với đối số của phương thức khỏi bảng băm.

Cú pháp:

hashtable_name.Remove(key);

Ví dụ:

objTable.Remove(004);

3. ContainsKey()

Phương thức này dùng để kiểm tra xem trong bảng băm có key được chỉ ra ở phần đối số của phương thức hay không. Ví dụ:

if (objTable.ContainsKey(004))
  Console.WriteLine("Yes");
else
  Console.WriteLine("No");

4. ContainsValue()

Phương thức này dùng để kiểm tra xem trong bảng băm có key được chỉ ra ở phần đối số của phương thức hay không. Ví dụ:

if (objTable.ContainsValue("Joe"))
  Console.WriteLine("Yes");
else
  Console.WriteLine("No");

5. Clear()

Phương thức này dùng để xóa tất cả các phần tử khỏi bảng băm. Ví dụ:

if (objTable.Count > 0)
  objTable.Clear();
else
  Console.WriteLine("Empty");

Các thuộc tính của Hashtable

1. Count

Thuộc tính này dùng để đếm số phần tử thực tế của bảng băm. Ví dụ:

if (objTable.Count == 24)
  Console.WriteLine("Full");

2. Keys

Thuộc tính này cung cấp một ICollection chứa danh sách các key của bảng băm. Ví dụ:

foreach (object key in objTable.Keys)
  Console.WriteLine(key);

3. Values

Thuộc tính này cung cấp một ICollection chứa danh sách các value của bảng băm. Ví dụ:

foreach (object value in objTable.Values)
  
Console.WriteLine(value);

4. IsReadOnly

Thuộc tính này dùng để kiểm tra xem Hashtable có phải là read-only hay không, nếu phải thì trả về true, ngược lại trả vể false. Ví dụ:

if (objTable.IsReadOnly)
  Console.WriteLine("Yes");
else
  Console.WriteLine("No");

Ví dụ về Hashtable

Ví dụ 1:

using System;
using System.Collections;

class HashCollection
{
  static void Main(string[] args)
  {
    Hashtable objTable = new Hashtable();
    objTable.Add(001, "John");
    objTable.Add(002, "Peter");
    objTable.Add(003, "James");
    objTable.Add(004, "Joe");
    Console.WriteLine("Number of elements in the hash table: " + objTable.Count);
    ICollection objCollection = objTable.Keys;
    Console.WriteLine("Original values stored in hashtable are: ");
    foreach (int i in objCollection)
    {
      Console.WriteLine(i + " : " + objTable[i]);
    }
    if (objTable.ContainsKey(002))
    {
      objTable[002] = "Patrick";
    }
    Console.WriteLine("Values stored in the hashtable after removing values");
    foreach (int i in objCollection)
    {
      Console.WriteLine(i + " : " + objTable[i]);
    }
  }
}

Trong ví dụ trên, phương thức Add() chèn các phần tử theo cặp key/value tương ứng vào bảng băm objTable; thuộc tính Count đếm số phần tử thực tế của bảng băm; thuộc tính key cung cấp một danh sách các key tới interface ICollection;  phương thức ContainsKey() sẽ kiểm tra xem  bảng băm có chứa key được chỉ ra trong đối số của phương thức hay không, nếu bảng băm có chứa key 002 thì thuộc tính mặc định Item sẽ được gọi tới thông qua cặp ngoặc vuông [] và sẽ thay thế value Peter thành Patrick. Việc hiển thị các value hay các key có thể theo thứ tự tăng hoặc giảm, hoặc cũng có thể là ngẫu nhiên tùy thuộc vào mã băm của từng key. Kết quả của ví dụ như sau:

hashtable-csharp-example1

Ví dụ 2:

using System;
using System.Collections;

class Authors
{
  static void Main(string[] args)
  {
    Hashtable objAuthors = new Hashtable();
    objAuthors.Add("AU01", "John");
    objAuthors.Add("AU04", "Mary");
    objAuthors.Add("AU09", "William");
    objAuthors.Add("AU11", "Rodrick");
    Console.WriteLine("Read-only : " +
      objAuthors.IsReadOnly);
    Console.WriteLine("Count : " + objAuthors.Count);
    IDictionaryEnumerator objCollection =
      objAuthors.GetEnumerator();
    Console.WriteLine("List of authors:\n");
    Console.WriteLine("Author ID \t Name");
    while (objCollection.MoveNext())
    {
      Console.WriteLine(objCollection.Key + "\t\t " +
        objCollection.Value);
    }
    if (objAuthors.Contains("AU01"))
    {
      Console.WriteLine("\nList contains author with id AU01");
    }
    else
    {
      Console.WriteLine("\nList does not contain author with id AU01");
    }
  }
}

Trong ví dụ trên, phương thức Add() thêm các phần tử vào objAuthors; phương thức IsReadOnly() kiểm tra xem các giá trị trong bảng băm có thể thay đổi được hay không. Phương thức Contains() sẽ kiểm tra xem giá trị 'AU01' có tồn tại trong danh sách các giá trị trị hay không. phương thức GetEnumerator() sẽ trả về một IDictionaryEnumerator và gán cho objCollection, sau đó dùng vòng lặp while để hiển thị các khóa và giá trị của các phần tử ra màn hình.

hashtable-csharp-example2

» Tiếp: SortedList
« Trước: ArrayList
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!