C# Hashtable με Παραδείγματα

⚡ Έξυπνη Σύνοψη

Το Hashtable σε C# είναι μια συλλογή από τον χώρο ονομάτων System.Collections που αποθηκεύει δεδομένα ως ζεύγη κλειδιού-τιμής, όπου κάθε μοναδικό κλειδί αντιστοιχεί σε μια τιμή και το κλειδί παρέχει γρήγορη αναζήτηση αυτής της αποθηκευμένης τιμής.

  • 📚 Ζεύγη κλειδιού-τιμής: Ένα Hashtable αποθηκεύει δύο τιμές ανά στοιχείο, ένα κλειδί και την τιμή του, αντί για τη μία τιμή που διατηρείται από μια στοίβα ή μια λίστα πινάκων.
  • ➕ Προσθήκη στοιχείων: Η μέθοδος Add εισάγει ένα κλειδί και μια τιμή μαζί και κάθε κλειδί μέσα στον πίνακα κατακερματισμού (Hashtable) πρέπει να είναι μοναδικό.
  • 👀 ContainsKey και ContainsValue: Αυτές οι μέθοδοι επιστρέφουν true ή false, ώστε να μπορείτε να ελέγξετε εάν ένα κλειδί ή μια τιμή υπάρχει ήδη.
  • 🔁 Τιμές ανάγνωσης: Η ιδιότητα Keys με ένα ICollection ή έναν βρόχο DictionaryEntry σάς επιτρέπει να διαβάζετε κάθε αποθηκευμένη τιμή με τη σειρά.
  • ️ Μέθοδοι και ιδιότητες: Οι επιλογές Αφαίρεση, Εκκαθάριση, Καταμέτρηση, Κλειδιά και Τιμές διαχειρίζονται και επιθεωρούν τα περιεχόμενα του πίνακα κατακερματισμού.
  • 🤖 Βοήθεια AI: Το GitHub Copilot βασίζεται σε κώδικα Hashtable, ενώ τα σύγχρονα C# και ML.NET προτιμούν το γενικό λεξικό για δεδομένα κλειδιού-τιμής ασφαλή για τύπους.

C# Hashtable

Τι είναι το Hashtable στο C#;

Ένας πίνακας κατακερματισμού είναι μια ειδική συλλογή που χρησιμοποιείται για την αποθήκευση στοιχείων κλειδιού-τιμής. Έτσι, αντί να αποθηκεύεται μόνο μία τιμή όπως η στοίβα, η λίστα πίνακα και η ουρά, ο πίνακας κατακερματισμού αποθηκεύει 2 τιμές. Αυτές οι 2 τιμές αποτελούν ένα στοιχείο του πίνακα κατακερματισμού.

Παρακάτω είναι μερικά παραδείγματα για το πώς μπορεί να φαίνονται οι τιμές ενός πίνακα κατακερματισμού.

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

Παραπάνω έχουμε 3 ζεύγη τιμών κλειδιών. Τα κλειδιά κάθε στοιχείου είναι 001, 002 και 003 αντίστοιχα. Οι τιμές κάθε ζεύγους βασικών τιμών είναι ". Καθαρά", "C#" και "ASP.Net" αντίστοιχα.

Ας δούμε τις λειτουργίες που είναι διαθέσιμες για τη συλλογή Hashtable με περισσότερες λεπτομέρειες.

Δήλωση του Hashtable

Η δήλωση ενός Hashtable φαίνεται παρακάτω. Ένα Hashtable δημιουργείται με τη βοήθεια του Hashtable Datatype. Η λέξη-κλειδί "νέα" χρησιμοποιείται για τη δημιουργία ενός αντικειμένου ενός Hashtable. Στη συνέχεια, το αντικείμενο εκχωρείται στη μεταβλητή ht.

Hashtable ht = new Hashtable()

Προσθήκη στοιχείων στο Hashtable

Η μέθοδος Προσθήκη χρησιμοποιείται για την προσθήκη ενός στοιχείου στο ουρά. Η γενική σύνταξη της δήλωσης δίνεται παρακάτω

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

Παράδειγμα 1:

Να θυμάστε ότι κάθε στοιχείο του πίνακα κατακερματισμού αποτελείται από 2 τιμές, η μία είναι το κλειδί και η άλλη η τιμή.

Τώρα, ας δούμε ότι αυτό λειτουργεί σε επίπεδο κώδικα. Όλος ο κώδικας που αναφέρεται παρακάτω θα εγγραφεί στην εφαρμογή Console μας.

Ο κώδικας θα γραφτεί στο αρχείο μας Program.cs. Στο παρακάτω πρόγραμμα, θα γράψουμε τον κώδικα για να δούμε πώς μπορούμε να χρησιμοποιήσουμε τις προαναφερθείσες μεθόδους.

Προς το παρόν, στο παράδειγμά μας, θα δούμε απλώς πώς μπορούμε να δημιουργήσουμε ένα hashtable , να προσθέσουμε στοιχεία στο 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. Στη συνέχεια προσθέτουμε στοιχεία στον πίνακα κατακερματισμού χρησιμοποιώντας τη μέθοδο Προσθήκη. Να θυμάστε ότι πρέπει να προσθέσουμε και ένα βασικό και ένα στοιχείο αξίας όταν προσθέτουμε κάτι στο hashtable.
  3. Δεν υπάρχει άμεσος τρόπος εμφάνισης των στοιχείων ενός πίνακα κατακερματισμού.
    • Για να εμφανίσουμε το hashtable , πρέπει πρώτα να λάβουμε τη λίστα των κλειδιών (001, 002 και 003) από τον πίνακα κατακερματισμού.
    • Αυτό γίνεται μέσω της διεπαφής ICollection. Αυτός είναι ένας ειδικός τύπος δεδομένων που μπορεί να χρησιμοποιηθεί για την αποθήκευση των κλειδιών συλλογών με δυνατότητα κατακερματισμού. Στη συνέχεια, εκχωρούμε τα κλειδιά της συλλογής hashtable στη μεταβλητή 'κλειδιά'.
  4. Στη συνέχεια, για κάθε τιμή κλειδιού, παίρνουμε τη σχετική τιμή στο hashtable χρησιμοποιώντας τη δήλωση ht[k].

Εάν ο παραπάνω κωδικός εισαχθεί σωστά και το πρόγραμμα εκτελεστεί, θα εμφανιστεί η ακόλουθη έξοδος.

Παραγωγή:

Hashtable σε C#

Ας δούμε μερικές ακόμη διαθέσιμες μεθόδους για πίνακες κατακερματισμού.

ContainsKey

Αυτή η μέθοδος χρησιμοποιείται για να δούμε εάν υπάρχει ένα κλειδί στο Hashtable. Παρακάτω είναι η γενική σύνταξη αυτής της δήλωσης. Η δήλωση θα επιστρέψει true εάν υπάρχει το κλειδί, διαφορετικά θα επιστρέψει την τιμή false.

Hashtable.Containskey(key)

ContainsValue

Αυτή η μέθοδος χρησιμοποιείται για να δούμε εάν υπάρχει μια τιμή στο Hashtable. Παρακάτω είναι η γενική σύνταξη αυτής της δήλωσης. Η δήλωση θα επιστρέψει true εάν υπάρχει η τιμή, διαφορετικά θα επιστρέψει την τιμή false.

Hashtable.ContainsValue(value)

Παράδειγμα 2:

Ας αλλάξουμε τον κωδικό στο δικό μας Εφαρμογή κονσόλας για να δείξουμε πώς μπορούμε να χρησιμοποιήσουμε τη μέθοδο "Containskey" και "ContainsValue".

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");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code Εξήγηση:-

  1. Αρχικά, χρησιμοποιούμε τη μέθοδο ContainsKey για να δούμε αν το κλειδί υπάρχει στο hashtable. Αυτή η μέθοδος θα επιστρέψει true εάν το κλειδί υπάρχει στο hashtable. Αυτή η μέθοδος θα πρέπει να επιστρέψει true καθώς το κλειδί υπάρχει στο hashtable.
  2. Στη συνέχεια χρησιμοποιούμε τη μέθοδο ContainsValue για να δούμε αν η τιμή υπάρχει στο hashtable. Αυτή η μέθοδος θα επιστρέψει "true" καθώς η τιμή υπάρχει στο hashtable.

Εάν ο παραπάνω κωδικός εισαχθεί σωστά και το πρόγραμμα εκτελεστεί, θα εμφανιστεί η ακόλουθη έξοδος.

Παραγωγή:

Hashtable σε C#

Από την έξοδο, μπορείτε να δείτε ξεκάθαρα ότι τόσο το κλειδί όσο και η τιμή που αναζητάτε υπάρχουν στον πίνακα κατακερματισμού.

Πώς να κάνετε επανάληψη σε ένα C# Hashtable

Τα παραπάνω παραδείγματα διαβάζουν τιμές μέσω της συλλογής Κλειδιά, αλλά ένα Hashtable μπορεί να διαβαστεί με πιο καθαρό τρόπο. Ένας βρόχος foreach μέσω ενός DictionaryEntry σας δίνει το κλειδί και την τιμή κάθε στοιχείου μαζί με ένα μόνο πέρασμα, που είναι ο πιο συνηθισμένος τρόπος ανάγνωσης ενός Hashtable.

Βήμα 1) Δημιουργήστε ένα Hashtable και προσθέστε τρία ζεύγη κλειδιού-τιμής σε αυτό.

Βήμα 2) Πραγματοποιήστε επανάληψη πάνω από τον πίνακα καταχώρησης (Hashtable) με μια μεταβλητή DictionaryEntry και, στη συνέχεια, διαβάστε τις ιδιότητες Κλειδί και Τιμή κάθε καταχώρησης.

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) δεν διατηρεί τη σειρά εισαγωγής, τα ζεύγη ενδέχεται να εμφανίζονται με διαφορετική ακολουθία από αυτήν που προστέθηκαν. Για να διαβάσετε μόνο τα κλειδιά, επαναλάβετε τη συλλογή Κλειδιά και για να διαβάσετε μόνο τις τιμές, επαναλάβετε τη συλλογή Τιμές.

Μέθοδοι και Ιδιότητες Hashtable C#

Η κλάση Hashtable παρουσιάζει ένα μικρό σύνολο μεθόδων και ιδιοτήτων που καλύπτουν σχεδόν κάθε εργασία που θα χρειαστείτε, από την προσθήκη και την αφαίρεση ζευγών έως τον έλεγχο της ιδιότητας μέλους και την καταμέτρηση στοιχείων. Τα πιο χρήσιμα μέλη παρατίθενται παρακάτω.

Μέλος Χαρακτηριστικά Περιγραφή
Προσθήκη(κλειδί, τιμή) Μέθοδος Εισάγει ένα νέο ζεύγος κλειδιού και τιμής. Το κλειδί πρέπει να είναι μοναδικό.
Αφαίρεση (κλειδί) Μέθοδος Διαγράφει το στοιχείο που ταιριάζει με το καθορισμένο κλειδί.
Σαφή() Μέθοδος Αφαιρεί κάθε ζεύγος κλειδιού-τιμής από τον πίνακα κατακερματισμού.
ΠεριέχειΚλειδί(κλειδί) Μέθοδος Επιστρέφει true όταν το δεδομένο κλειδί είναι παρόν.
ΠεριέχειΤιμή(τιμή) Μέθοδος Επιστρέφει true όταν η δεδομένη τιμή υπάρχει.
Κόμης Ιδιοκτησία Λαμβάνει τον αριθμό των αποθηκευμένων ζευγών κλειδιού-τιμής.
Κλειδιά Ιδιοκτησία Επιστρέφει μια συλλογή όλων των κλειδιών.
Αξίες Ιδιοκτησία Επιστρέφει μια συλλογή όλων των τιμών.

Επειδή κάθε κλειδί είναι κατακερματισμένο, το ContainsKey και ο ευρετηριαστής εντοπίζουν ένα στοιχείο σε σχεδόν σταθερό χρόνο, κάτι που καθιστά ένα Hashtable τόσο χρήσιμο για γρήγορες αναζητήσεις.

Διαφορά μεταξύ Hashtable και Λεξικού σε C#

Ένα Hashtable και ένα Dictionary αποθηκεύουν ζεύγη κλειδιού-τιμής και ανήκουν στην ευρύτερη οικογένεια της C#. συλλογέςΗ σημαντική διαφορά είναι η ασφάλεια τύπου και αυτή η διαφορά αποφασίζει ποιον τύπο πρέπει να επιλέξετε στον νέο κώδικα.

  • Ασφάλεια τύπου: Ένα Hashtable αποθηκεύει κάθε κλειδί και τιμή ως αντικείμενο, ενώ το Dictionary είναι γενικό, επομένως ο μεταγλωττιστής ελέγχει τους τύπους που χρησιμοποιείτε.
  • Χώρος ονομάτων: Το Hashtable βρίσκεται στο System.Collections, ενώ το Dictionary βρίσκεται στο System.Collections.Generic.
  • Box: Ένα Hashtable περιέχει τύπους τιμών όπως int, αλλά ένα γενικό λεξικό τους αποθηκεύει απευθείας και αποφεύγει αυτό το κόστος.
  • Απόδοση: Το λεξικό είναι συνήθως πιο γρήγορο επειδή δεν χρειάζεται να μεταφερθεί πίσω από το αντικείμενο όταν διαβάζετε μια τιμή.
  • Ασφάλεια νήματος: Το Hashtable προσφέρει το Syncχρονικό περιτύλιγμα για έναν συγγραφέα με πολλούς αναγνώστες, ενώ ο ταυτόχρονος κώδικας συνήθως επιλέγει το ConcurrentDictionary.

Για κάθε νέο έργο, το γενικό λεξικό είναι η συνιστώμενη επιλογή και το μη γενικό Hashtable εμφανίζεται κυρίως σε παλαιότερο κώδικα.

Συχνές Ερωτήσεις

Η μέθοδος Remove διαγράφει το στοιχείο με ένα δεδομένο κλειδί και μειώνει την Count κατά ένα. Εάν το κλειδί δεν υπάρχει, δεν συμβαίνει τίποτα, επομένως καλέστε πρώτα την ContainsKey όταν πρέπει να είστε σίγουροι ότι το κλειδί υπάρχει.

Όχι. Κάθε κλειδί σε έναν πίνακα κατακερματισμού (Hashtable) πρέπει να είναι μοναδικό. Η κλήση της συνάρτησης Add με ένα κλειδί που υπάρχει ήδη δημιουργεί ένα ArgumentException. Μπορείτε, ωστόσο, να αποθηκεύσετε την ίδια τιμή κάτω από πολλά διαφορετικά κλειδιά χωρίς κανένα σφάλμα.

Ένα Hashtable υποστηρίζει έναν συγγραφέα με πολλούς αναγνώστες με ασφάλεια. Για πολλά νήματα γραφής, τυλίξτε το χρησιμοποιώντας το Hashtable.Syncχρονισμένο ή προτιμήστε το ConcurrentDictionary από το System.Collections.Concurrent, το οποίο χειρίζεται ταυτόχρονες αναγνώσεις και εγγραφές χωρίς εξωτερικά κλειδώματα.

Η αναζήτηση μιας τιμής ανά κλειδί εκτελείται σε σχεδόν σταθερό χρόνο O(1) κατά μέσο όρο, επειδή το κλειδί κατακερματίζεται για να βρει τον κάδο του. Οι έντονες συγκρούσεις κατακερματισμού μπορούν να την επιβραδύνουν, αλλά αυτό είναι σπάνιο με καλά κατανεμημένα κλειδιά.

Μια τιμή μπορεί να είναι null, αλλά ένα κλειδί δεν μπορεί. Η μεταβίβαση ενός κλειδιού null στην Add ή στο indexer δημιουργεί ένα ArgumentNullException. Κάθε κλειδί πρέπει επίσης να είναι μοναδικό και δεν πρέπει να αλλάζει κατά την αποθήκευσή του.

Ένα Hashtable δεν διατηρεί σειρά, επομένως δεν μπορεί να ταξινομηθεί στη θέση του. Αντιγράψτε τα κλειδιά του σε μια λίστα ή σε ένα ArrayList, ταξινομήστε αυτήν τη λίστα και, στη συνέχεια, διαβάστε τις τιμές ανά κλειδί. Ένα SortedList διατηρεί τις καταχωρήσεις του ταξινομημένες αυτόματα.

Ναι. Το GitHub Copilot γράφει δηλώσεις Hashtable, κλήσεις Add και βρόχους DictionaryEntry από ένα σύντομο σχόλιο ή όνομα μεθόδου. Συχνά προτείνει το γενικό Dictionary, καθώς αυτή είναι η συνιστώμενη συλλογή για νέο κώδικα C#.

Τα δεδομένα εκπαίδευσης του ML.NET ρέουν μέσω τυποποιημένων συλλογών και του αγωγού IDataView αντί για έναν πίνακα κατακερματισμού (Hashtable). Ωστόσο, οι χάρτες κλειδιών-τιμών που βασίζονται σε κατακερματισμό εξακολουθούν να υποστηρίζουν αναζητήσεις χαρακτηριστικών, κωδικοποίηση λεξιλογίου και προσωρινή αποθήκευση γύρω από ένα μοντέλο μηχανικής μάθησης.

Συνοψίστε αυτήν την ανάρτηση με: