C # Hashtable พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

Hashtable ใน C# เป็นคอลเลกชันจากเนมสเปซ System.Collections ที่จัดเก็บข้อมูลในรูปแบบคู่คีย์-ค่า โดยแต่ละคีย์ที่ไม่ซ้ำกันจะแมปกับค่า และคีย์จะช่วยให้ค้นหาค่าที่จัดเก็บไว้ได้อย่างรวดเร็ว

  • 📚 คู่คีย์-ค่า: แฮชเทเบิลจะเก็บค่าสองค่าต่อองค์ประกอบ คือ คีย์และค่าของคีย์นั้น แทนที่จะเก็บเพียงค่าเดียวเหมือนในสแต็กหรืออาร์เรย์ลิสต์
  • การเพิ่มองค์ประกอบ: เมธอด Add จะแทรกคีย์และค่าเข้าด้วยกัน โดยทุกคีย์ภายใน Hashtable จะต้องไม่ซ้ำกัน
  • 👀 ContainsKey และ ContainsValue: เมธอดเหล่านี้จะคืนค่าเป็นจริงหรือเท็จ เพื่อให้คุณสามารถทดสอบได้ว่าคีย์หรือค่าดังกล่าวมีอยู่แล้วหรือไม่
  • 🔁 คุณค่าของการอ่าน: คุณสมบัติ Keys ที่ใช้ร่วมกับ ICollection หรือลูป DictionaryEntry ช่วยให้คุณสามารถอ่านค่าที่จัดเก็บไว้ทั้งหมดทีละค่าได้
  • 🛠️ วิธีการและคุณสมบัติ: คำสั่ง Remove, Clear, Count, Keys และ Values ​​ใช้สำหรับจัดการและตรวจสอบเนื้อหาของ Hashtable
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot สร้างโครงร่างโค้ด Hashtable ในขณะที่ C# และ ML.NET รุ่นใหม่นิยมใช้ Dictionary ทั่วไปสำหรับข้อมูลแบบคู่คีย์-ค่าที่มีความปลอดภัยด้านประเภทข้อมูล

C# แฮชเทเบิ้ล

Hashtable ใน C # คืออะไร?

ตารางแฮชเป็นคอลเลกชันพิเศษที่ใช้ในการจัดเก็บรายการคีย์-ค่า ดังนั้นแทนที่จะจัดเก็บเพียงค่าเดียว เช่น สแต็ก รายการอาร์เรย์ และคิว ตารางแฮชจะเก็บ 2 ค่า ค่า 2 เหล่านี้ประกอบกันเป็นองค์ประกอบของตารางแฮช

ด้านล่างนี้คือตัวอย่างบางส่วนของค่าของตารางแฮชที่อาจมีลักษณะดังนี้

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

ด้านบนเรามีคู่ค่าคีย์ 3 คู่ คีย์ของแต่ละองค์ประกอบคือ 001, 002 และ 003 ตามลำดับ ค่าของคู่ค่าคีย์แต่ละคู่คือ “สุทธิ.“, “C#” และ “ASP.Net” ตามลำดับ

มาดูการดำเนินการที่มีให้สำหรับคอลเลกชัน Hashtable อย่างละเอียดเพิ่มเติม

คำประกาศของแฮชเทเบิล

การประกาศ Hashtable แสดงอยู่ด้านล่าง Hashtable ถูกสร้างขึ้นด้วยความช่วยเหลือของประเภทข้อมูล Hashtable คำหลัก "ใหม่" ใช้เพื่อสร้างวัตถุของ Hashtable จากนั้นวัตถุจะถูกกำหนดให้กับตัวแปร ht

Hashtable ht = new Hashtable()

การเพิ่มองค์ประกอบลงใน Hashtable

วิธีการเพิ่มใช้ในการเพิ่มองค์ประกอบให้กับ คิว- ไวยากรณ์ทั่วไปของคำสั่งได้รับด้านล่าง

HashTable.add("key","value")

1 ตัวอย่าง:

โปรดจำไว้ว่าแต่ละองค์ประกอบของตารางแฮชประกอบด้วย 2 ค่า ค่าหนึ่งคือคีย์ และอีกค่าคือค่า

ตอนนี้เรามาดูการทำงานในระดับโค้ดกันดีกว่า โค้ดที่กล่าวถึงด้านล่างทั้งหมดจะถูกเขียนลงในแอปพลิเคชันคอนโซลของเรา

รหัสจะถูกเขียนลงในไฟล์ Program.cs ของเรา ในโปรแกรมด้านล่างเราจะเขียนโค้ดเพื่อดูว่าเราสามารถใช้วิธีการที่กล่าวมาข้างต้นได้อย่างไร

สำหรับตอนนี้ในตัวอย่างของเรา เราจะดูว่าเราจะสร้าง hashtable ได้อย่างไร เพิ่มองค์ประกอบลงใน hashtable และแสดงองค์ประกอบเหล่านั้นตามนั้น

แฮชเทเบิ้ลใน 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 คำอธิบาย:-

  1. ขั้นแรก เราประกาศตัวแปร hashtable โดยใช้ประเภทข้อมูล Hashtable โดยใช้คีย์เวิร์ด "ใหม่" ชื่อของตัวแปรที่กำหนดคือ 'ht'
  2. จากนั้นเราเพิ่มองค์ประกอบลงในตารางแฮชโดยใช้วิธีเพิ่ม โปรดจำไว้ว่าเราจำเป็นต้องเพิ่มทั้งองค์ประกอบคีย์และค่าเมื่อเพิ่มบางอย่างลงในแฮชเทเบิล
  3. ไม่มีวิธีโดยตรงในการแสดงองค์ประกอบของตารางแฮช
    • ในการแสดง hashtable เราต้องรับรายการคีย์ (001, 002 และ 003) จากตารางแฮชก่อน
    • ซึ่งทำได้ผ่านอินเทอร์เฟซ ICollection นี่เป็นประเภทข้อมูลพิเศษที่สามารถใช้เพื่อจัดเก็บคีย์ของคอลเลกชันที่แฮชได้ จากนั้นเราจะกำหนดคีย์ของคอลเลกชันแฮชให้กับตัวแปร 'คีย์'
  4. ถัดไปสำหรับแต่ละค่าคีย์ เราได้รับค่าที่เกี่ยวข้องใน hashtable โดยใช้คำสั่ง ht[k]

หากป้อนโค้ดด้านบนอย่างถูกต้องแล้วและรันโปรแกรมจะแสดงผลลัพธ์ต่อไปนี้

Output:

แฮชเทเบิ้ลใน C#

มาดูวิธีการเพิ่มเติมสำหรับตารางแฮชกัน

ประกอบด้วยคีย์

วิธีการนี้ใช้เพื่อดูว่ามีคีย์อยู่ใน Hashtable หรือไม่ ด้านล่างนี้คือไวยากรณ์ทั่วไปของคำสั่งนี้ คำสั่งจะคืนค่าเป็นจริงหากมีคีย์อยู่ มิฉะนั้นจะส่งคืนค่าเท็จ

Hashtable.Containskey(key)

ประกอบด้วยค่า

วิธีการนี้ใช้เพื่อดูว่ามีค่าอยู่ใน Hashtable หรือไม่ ด้านล่างนี้คือไวยากรณ์ทั่วไปของคำสั่งนี้ คำสั่งจะส่งกลับค่าจริงหากมีค่าอยู่ มิฉะนั้นจะส่งกลับค่าเท็จ

Hashtable.ContainsValue(value)

2 ตัวอย่าง:

มาเปลี่ยนรหัสในของเรา แอปพลิเคชันคอนโซล เพื่อแสดงให้เห็นว่าเราสามารถใช้เมธอด "Containskey" และ "ContainsValue" ได้อย่างไร

แฮชเทเบิ้ลใน 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 คำอธิบาย:-

  1. ขั้นแรก เราใช้เมธอด ประกอบด้วยคีย์ เพื่อดูว่าคีย์นั้นมีอยู่ในแฮชเทเบิลหรือไม่ วิธีนี้จะคืนค่าเป็นจริงหากมีคีย์อยู่ในแฮชเทเบิล วิธีการนี้ควรคืนค่าเป็นจริงเนื่องจากมีคีย์อยู่ในแฮชเทเบิล
  2. จากนั้นเราใช้เมธอด ประกอบด้วยค่า เพื่อดูว่ามีค่าอยู่ในแฮชเทเบิลหรือไม่ วิธีนี้จะคืนค่า 'จริง' เนื่องจากค่ามีอยู่ในแฮชเทเบิล

หากป้อนโค้ดด้านบนอย่างถูกต้องแล้วและรันโปรแกรมจะแสดงผลลัพธ์ต่อไปนี้

Output:

แฮชเทเบิ้ลใน C#

จากผลลัพธ์ คุณจะเห็นได้อย่างชัดเจนว่าทั้งคีย์และค่าที่กำลังค้นหามีอยู่ในตารางแฮช

วิธีการวนลูปผ่านแฮชเทเบิลใน C#

ตัวอย่างข้างต้นอ่านค่าผ่านคอลเลกชัน Keys แต่การอ่าน Hashtable สามารถทำได้ด้วยวิธีที่สะอาดกว่า การใช้ลูป foreach กับ DictionaryEntry จะส่งทั้งคีย์และค่าของทุกองค์ประกอบมาให้พร้อมกันในการอ่านครั้งเดียว ซึ่งเป็นวิธีที่ใช้กันทั่วไปในการอ่าน Hashtable

ขั้นตอน 1) สร้างแฮชเทเบิลและเพิ่มคู่คีย์-ค่าสามคู่ลงไปในนั้น

ขั้นตอน 2) วนลูปผ่าน Hashtable โดยใช้ตัวแปร DictionaryEntry จากนั้นอ่านคุณสมบัติ Key และ Value ของแต่ละรายการ

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 คำอธิบาย:-

  1. มีการสร้าง Hashtable ชื่อ ht และมีการแทรกคู่คีย์-ค่าสามคู่โดยใช้วิธี Add
  2. ลูป foreach จะกำหนดแต่ละองค์ประกอบให้กับ DictionaryEntry ซึ่งคุณสมบัติ Key และ Value จะแสดงส่วนประกอบทั้งสองส่วนของคู่

เมื่อโปรแกรมทำงาน มันจะพิมพ์แต่ละคีย์พร้อมกับค่าของมัน เช่น 101 – Javaเนื่องจาก Hashtable ไม่เก็บลำดับการแทรก ข้อมูลคู่จึงอาจปรากฏในลำดับที่แตกต่างจากที่เพิ่มเข้ามา หากต้องการอ่านเฉพาะคีย์ ให้วนลูปผ่านคอลเลกชัน Keys และหากต้องการอ่านเฉพาะค่า ให้วนลูปผ่านคอลเลกชัน Values ​​แทน

เมธอดและคุณสมบัติของ Hashtable ใน C#

คลาส Hashtable มีเมธอดและคุณสมบัติจำนวนไม่มากที่ครอบคลุมงานเกือบทุกอย่างที่คุณต้องการ ตั้งแต่การเพิ่มและลบคู่ ไปจนถึงการตรวจสอบความเป็นสมาชิกและการนับจำนวนองค์ประกอบ สมาชิกที่ใช้งานได้สะดวกที่สุดแสดงไว้ด้านล่าง

สมาชิกทั่วไป ประเภท Descriptไอออน
เพิ่ม (คีย์, ค่า) วิธี เพิ่มคู่คีย์และค่าใหม่ โดยคีย์ต้องไม่ซ้ำกัน
ลบ(คีย์) วิธี ลบองค์ประกอบที่ตรงกับคีย์ที่ระบุ
ชัดเจน() วิธี ลบทุกคู่คีย์-ค่าออกจากแฮชเทเบิล
ประกอบด้วยคีย์ (คีย์) วิธี ส่งคืนค่าจริงเมื่อพบคีย์ที่กำหนด
ประกอบด้วยค่า (ค่า) วิธี ส่งคืนค่าจริงเมื่อมีค่าที่กำหนดอยู่
นับ อสังหาริมทรัพย์ ดึงจำนวนคู่คีย์-ค่าที่จัดเก็บไว้
คีย์ อสังหาริมทรัพย์ ส่งคืนคอลเลกชันของคีย์ทั้งหมด
ความคุ้มค่า อสังหาริมทรัพย์ ส่งคืนชุดค่าทั้งหมด

เนื่องจากแต่ละคีย์ถูกแฮชไว้ ContainsKey และตัวจัดทำดัชนีจึงสามารถค้นหาองค์ประกอบได้ในเวลาเกือบคงที่ ซึ่งเป็นสิ่งที่ทำให้ Hashtable มีประโยชน์อย่างมากสำหรับการค้นหาอย่างรวดเร็ว

ความแตกต่างระหว่าง Hashtable และ Dictionary ใน C#

ทั้ง Hashtable และ Dictionary ต่างก็ใช้เก็บคู่คีย์-ค่า และทั้งคู่ก็อยู่ในตระกูลเดียวกันของภาษา C# คอลเลกชันความแตกต่างที่สำคัญคือความปลอดภัยของประเภทข้อมูล และความแตกต่างนี้จะเป็นตัวตัดสินว่าคุณควรเลือกใช้แบบใดในการเขียนโค้ดใหม่

  • ความปลอดภัยประเภท: Hashtable จะเก็บทุกคีย์และค่าไว้เป็นอ็อบเจ็กต์ ในขณะที่ Dictionary จะเก็บ เนื่องจากเป็นแบบทั่วไป คอมไพเลอร์จึงตรวจสอบประเภทที่คุณใช้
  • Namespace: Hashtable อยู่ใน System.Collections ในขณะที่ Dictionary อยู่ใน System.Collections.Generic
  • Boxไอเอ็นจี: Hashtable จะจัดเก็บค่าประเภทต่างๆ เช่น int ไว้ในที่เดียว แต่ Dictionary ทั่วไปจะจัดเก็บข้อมูลเหล่านั้นโดยตรงและหลีกเลี่ยงค่าใช้จ่ายดังกล่าว
  • ประสิทธิภาพ: โดยทั่วไปแล้ว การอ่านค่าจาก Dictionary จะเร็วกว่า เพราะไม่ต้องแปลงกลับจาก Object เมื่ออ่านค่า
  • ความปลอดภัยของเกลียว: Hashtable นำเสนอ Syncตัวห่อแบบซิงโครไนซ์สำหรับผู้เขียนหนึ่งรายที่มีผู้อ่านหลายราย ในขณะที่โค้ดแบบขนานมักจะเลือกใช้ ConcurrentDictionary

สำหรับโปรเจ็กต์ใหม่ ๆ แนะนำให้ใช้ Dictionary แบบทั่วไป ส่วน Hashtable ที่ไม่ใช่แบบทั่วไปนั้นส่วนใหญ่จะพบในโค้ดเก่า ๆ

คำถามที่พบบ่อย

เมธอด Remove จะลบองค์ประกอบที่มีคีย์ที่กำหนดและลดค่า Count ลงหนึ่ง หากไม่มีคีย์อยู่ จะไม่มีอะไรเกิดขึ้น ดังนั้นควรเรียก ContainsKey ก่อนเมื่อต้องการแน่ใจว่าคีย์นั้นมีอยู่จริง

ไม่ คีย์ทุกตัวใน Hashtable ต้องไม่ซ้ำกัน การเรียกใช้ Add ด้วยคีย์ที่มีอยู่แล้วจะทำให้เกิด ArgumentException อย่างไรก็ตาม คุณสามารถเก็บค่าเดียวกันไว้ในคีย์ที่แตกต่างกันหลายๆ คีย์ได้โดยไม่มีข้อผิดพลาดใดๆ

Hashtable ช่วยให้ผู้เขียนหนึ่งคนสามารถอ่านได้หลายคนอย่างปลอดภัย สำหรับการเขียนหลายๆ เรื่องพร้อมกัน ควรใช้ Hashtable ครอบไว้Syncหรือเลือกใช้ ConcurrentDictionary จาก System.Collections.Concurrent ซึ่งจัดการการอ่านและการเขียนพร้อมกันโดยไม่ต้องใช้ล็อกภายนอก

การค้นหาค่าโดยใช้คีย์จะใช้เวลา O(1) โดยเฉลี่ยเกือบคงที่ เนื่องจากคีย์จะถูกแฮชเพื่อค้นหาบัคเก็ต การชนกันของแฮชจำนวนมากอาจทำให้ช้าลง แต่ก็เกิดขึ้นได้ยากหากคีย์มีการกระจายตัวที่ดี

ค่าอาจเป็นค่าว่างได้ แต่คีย์ไม่สามารถเป็นค่าว่างได้ การส่งคีย์ที่เป็นค่าว่างไปยังฟังก์ชัน Add หรือตัวสร้างดัชนีจะทำให้เกิดข้อผิดพลาด ArgumentNullException นอกจากนี้ คีย์แต่ละตัวต้องไม่ซ้ำกันและไม่ควรเปลี่ยนแปลงในขณะที่ถูกจัดเก็บ

Hashtable ไม่เก็บลำดับ ดังนั้นจึงไม่สามารถเรียงลำดับได้โดยตรง ต้องคัดลอกคีย์ของ Hashtable ไปไว้ในลิสต์หรือ ArrayList จากนั้นเรียงลำดับลิสต์นั้น แล้วจึงอ่านค่าตามคีย์ ในขณะที่ SortedList จะเรียงลำดับรายการโดยอัตโนมัติ

ใช่แล้ว GitHub Copilot จะเขียนการประกาศ Hashtable, การเรียกใช้ Add และลูป DictionaryEntry จากข้อความแสดงความคิดเห็นสั้นๆ หรือชื่อเมธอด โดยมักจะแนะนำให้ใช้ Dictionary ทั่วไปแทน เนื่องจากเป็นคอลเลกชันที่แนะนำสำหรับโค้ด C# ใหม่ๆ

ข้อมูลสำหรับการฝึกอบรมใน ML.NET ไหลผ่านคอลเลกชันที่มีประเภทและไปป์ไลน์ IDataView แทนที่จะใช้ Hashtable อย่างไรก็ตาม แผนที่คีย์-ค่าแบบแฮชยังคงรองรับการค้นหาคุณลักษณะ การเข้ารหัสคำศัพท์ และการแคชข้อมูลรอบ ๆ โมเดลการเรียนรู้ของเครื่องได้

สรุปโพสต์นี้ด้วย: