Προγραμματισμός

Εργασία με Hashtable και λεξικό στο C #

Το Microsoft .Net Framework παρέχει εξαιρετική υποστήριξη για εργασία με συλλογές. Οι συλλογές χρησιμοποιούνται για αποθήκευση και ανάκτηση δεδομένων. Χρησιμοποιείτε συλλογές στην εφαρμογή σας για να κατανείμετε δυναμικά τη μνήμη για να αποθηκεύσετε στοιχεία και στη συνέχεια να τα ανακτήσετε χρησιμοποιώντας το κλειδί ή το ευρετήριο όπως και όταν χρειάζεται. Βασικά, μια συλλογή αντιπροσωπεύει ένα σύνολο αντικειμένων στα οποία μπορείτε να έχετε πρόσβαση επαναλαμβάνοντας κάθε ένα από τα στοιχεία της συλλογής.

Hashtable

Οι τύποι στο χώρο ονομάτων System.Collections αποθηκεύουν δεδομένα ως αντικείμενα του τύπου Object. Το Hashtable αντιπροσωπεύει μια δομή δεδομένων που μπορεί να αποθηκεύσει αντικείμενα ως ζεύγη τιμών κλειδιών. Μπορείτε να αναζητήσετε μια τιμή σε μια παρουσία κλάσης Hashtable χρησιμοποιώντας το αντίστοιχο κλειδί. Σημειώστε ότι τόσο το κλειδί όσο και η τιμή που είναι αποθηκευμένη σε παρουσία Hashtable είναι του τύπου αντικειμένου. Σημειώστε ότι το κλειδί δεν μπορεί να είναι μηδενικό. Μπορείτε να αποθηκεύσετε μια μηδενική τιμή ούτως ή άλλως. Η ακόλουθη λίστα κώδικα δείχνει πώς μπορείτε να αποθηκεύσετε και να ανακτήσετε κλειδιά / τιμές από μια παρουσία Hashtable.

στατικό κενό Κεντρικό ()

       {

Hashtable hashTable = νέο Hashtable ();

hashTable.Add (1, "Joydip");

hashTable.Add (2, "James");

hashTable.Add (3, "Steve");

Console.WriteLine ("Τα ζεύγη κλειδιών / τιμών είναι: -");

foreach (κλειδί int στο hashTable.Keys)

           {

Console.WriteLine ("Key:" + key + "Value:" + hashTable [key] .ToString ());

           }

Κονσόλα. Διαβάστε ();

       }

Μπορείτε επίσης να επωφεληθείτε από τη μέθοδο GetEnumerator () της κλάσης Hashtable και στη συνέχεια να απαριθμήσετε τη συλλογή για να ανακτήσετε τα ζεύγη κλειδιών / τιμών που είναι αποθηκευμένα σε αυτήν. Ακολουθεί ένα απόσπασμα κώδικα που το απεικονίζει αυτό.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator ();

ενώ (enumerator.MoveNext ())

{

Console.WriteLine ("Key:" + enumerator.Key.ToString () + "Value:" + enumerator.Value.ToString ());

}

Μπορείτε επίσης να επωφεληθείτε από την κατηγορία DictionaryEntry για να επαναλάβετε τα στοιχεία σε ένα Hashtable. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορεί να γίνει αυτό.

Hashtable hashTable = νέο Hashtable ();

hashTable.Add (1, "Joydip");

hashTable.Add (2, "James");

hashTable.Add (3, "Steve");

foreach (Λεξικό Είσοδος λεξικό Είσοδος σε hashTable)

{

Console.WriteLine ("Key:" + dictionaryEntry.Key.ToString () + "Value:" + dictionaryEntry.Value.ToString ());

}

Η αναζήτηση ενός αντικειμένου σε Hashtable είναι ταχύτερη σε σύγκριση με άλλες μη γενικές συλλογές - ας καταλάβουμε γιατί. Μια εγγραφή σε Hashtable σε κάδους (κάθε κάδος μπορεί να περιέχει πολλές εγγραφές) χρησιμοποιώντας πλήκτρα κατακερματισμού. Το κλειδί κατακερματισμού δημιουργείται με τη σειρά του αυτόματα χρησιμοποιώντας έναν αλγόριθμο κατακερματισμού. Το MSDN δηλώνει: "Όταν ένα στοιχείο προστίθεται στο Hashtable, το στοιχείο τοποθετείται σε έναν κάδο με βάση τον κωδικό κατακερματισμού του κλειδιού. Οι επακόλουθες αναζητήσεις του κλειδιού χρησιμοποιούν τον κωδικό κατακερματισμού του κλειδιού για αναζήτηση σε έναν μόνο κάδο, μειώνοντας έτσι ουσιαστικά τον αριθμό των βασικών συγκρίσεων που απαιτούνται για την εύρεση ενός στοιχείου. "

Λεξικό

Μερικές από τις σημαντικές τάξεις στο System.Collections.Generic namessepace περιλαμβάνουν: List, Queue, HashSet, LinkedList, Stack, LinkedListNode και Dictionary. Η κλάση λεξικού στο C # αντιπροσωπεύει μια γενική δομή δεδομένων που μπορεί να περιέχει κλειδιά και τιμές δεδομένων. Ως εκ τούτου, μπορείτε να αποθηκεύσετε δεδομένα οποιουδήποτε τύπου σε μια παρουσία Λεξικού.

Σημειώστε ότι ενώ η διεπαφή ICollection επεκτείνει τη διεπαφή IEnumerable, τόσο οι διεπαφές IDictionary όσο και οι IList επεκτείνουν τη διεπαφή ICollection. Η κλάση λεξικού περιέχεται εντός του χώρου ονομάτων System.Collections.Generic. Στην ουσία, ένα λεξικό περιέχει μια γενική συλλογή ζευγών κλειδιών / τιμών. Μπορείτε να επωφεληθείτε από τη μέθοδο Προσθήκη της κατηγορίας Λεξικών για να αποθηκεύσετε αντικείμενα σε μια παρουσία Λεξικού. Ένα λεξικό είναι γρηγορότερο από ένα Hashtable καθώς εξαλείφει τα γενικά έξοδα πυγμαχίας και μη εγκιβωτισμού.

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να αποθηκεύσετε και να ανακτήσετε αντικείμενα μέσα σε μια παρουσία Λεξικού.

Λεξικό λεξικό = νέο λεξικό ();

λεξικό. Προσθήκη (1, "Joydip");

λεξικό. Προσθήκη (2, "James");

λεξικό. Προσθήκη (3, "Steve");

foreach (KeyValuePair kvp στο λεξικό)

{

Console.WriteLine (kvp.Key.ToString () + "-" + kvp.Value.ToString ());

}

Η βασική διαφορά μεταξύ ενός Hashtable και ενός λεξικού είναι ότι ενώ το πρώτο δεν είναι δακτυλογραφημένο και απαιτεί επιβάρυνση πυγμαχίας και μη εγκιβωτισμού, το δεύτερο δεν συμβαίνει όπως είναι δακτυλογραφημένο. Υπάρχει μια άλλη διαφορά μεταξύ τους. Εάν χρησιμοποιείτε ένα ευρετήριο για να ανακτήσετε μια τιμή από μια παρουσία Hashtable και το στοιχείο δεν υπάρχει, θα σας επιστραφεί μια μηδενική τιμή. Αντίθετα, εάν προσπαθήσετε να ανακτήσετε ένα ανύπαρκτο στοιχείο από μια παρουσία Λεξικού, θα δημιουργηθεί μια εξαίρεση. Σημειώστε ότι ούτε το Hashtable ούτε το Λεξικό θα εγγυώνταν τη διατήρηση της σειράς των αντικειμένων στη συλλογή.

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