Programovanie

Práca s Hashtable a slovníkom v C #

Microsoft .Net Framework poskytuje vynikajúcu podporu pre prácu so zbierkami. Zbierky sa používajú na ukladanie a vyhľadávanie údajov. Kolekcie vo svojej aplikácii používate na dynamické alokovanie pamäte na ukladanie prvkov a ich následné načítanie pomocou kľúča alebo indexu podľa potreby. Kolekcia v zásade predstavuje množinu objektov, ku ktorým máte prístup opakovaním každého z prvkov kolekcie.

Hashtable

Typy v mennom priestore System.Collections ukladajú údaje ako objekty typu Object. Hashtable predstavuje dátovú štruktúru, ktorá dokáže ukladať objekty ako páry kľúč - hodnota. Hodnotu môžete vyhľadať v inštancii triedy Hashtable pomocou príslušného klávesu. Upozorňujeme, že kľúč aj hodnota, ktorá je uložená v inštancii Hashtable, sú typu objektu. Upozorňujeme, že kľúč nemôže mať hodnotu null. Môžete mať aj tak uloženú nulovú hodnotu. Nasledujúci zoznam kódov ilustruje, ako môžete ukladať a načítať kľúč / hodnota z inštancie Hashtable.

static void Main ()

       {

Hashtable hashTable = nový Hashtable ();

hashTable.Add (1, "Joydip");

hashTable.Add (2, "James");

hashTable.Add (3, "Steve");

Console.WriteLine ("Páry kľúč / hodnota sú: -");

foreach (int kľúč v hashTable.Keys)

           {

Console.WriteLine ("Kľúč:" + kľúč + "Hodnota:" + hashTable [kľúč] .ToString ());

           }

Console.Read ();

       }

Môžete tiež využiť metódu GetEnumerator () triedy Hashtable a potom enumerovať kolekciu a načítať páry kľúč / hodnota uložené v nej. Toto je útržok kódu, ktorý to ilustruje.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator ();

while (enumerator.MoveNext ())

{

Console.WriteLine ("Kľúč:" + enumerator.Key.ToString () + "Hodnota:" + enumerator.Value.ToString ());

}

Môžete tiež využiť triedu DictionaryEntry na iteráciu položiek v Hashtable. Nasledujúci úryvok kódu ilustruje, ako je to možné.

Hashtable hashTable = nový Hashtable ();

hashTable.Add (1, "Joydip");

hashTable.Add (2, "James");

hashTable.Add (3, "Steve");

foreach (DictionaryEntry dictionaryEntry v hashTable)

{

Console.WriteLine ("Kľúč:" + dictionaryEntry.Key.ToString () + "Hodnota:" + dictionaryEntry.Value.ToString ());

}

Hľadanie položky v tabuľke hash je rýchlejšie v porovnaní s inými generickými zbierkami - pochopme prečo. Záznam v Hashtable v segmentoch (každý segment môže obsahovať viac záznamov) pomocou hash kľúčov. Hašovací kľúč je zase generovaný automaticky pomocou hashovacieho algoritmu. MSDN uvádza: "Keď sa do Hashtable pridá prvok, prvok sa umiestni do vedra na základe hašovacieho kódu kľúča. Pri následnom vyhľadávaní kľúča sa použije hashový kód kľúča na vyhľadanie iba v jednom konkrétnom segmente, čím sa podstatne znížil počet kľúčových porovnaní potrebných na nájdenie prvku. ““

Slovník

Niektoré z dôležitých tried v System.Collections.Generic mennom priestore zahŕňajú: List, Queue, HashSet, LinkedList, Stack, LinkedListNode a Dictionary. Trieda Dictionary v C # predstavuje všeobecnú dátovú štruktúru, ktorá môže obsahovať kľúče a hodnoty údajov. Preto môžete v inštancii slovníka ukladať údaje ľubovoľného typu.

Všimnite si, že zatiaľ čo rozhranie ICollection rozširuje rozhranie IEnumerable, rozhranie IDictionary aj IList rozširuje rozhranie ICollection. Trieda Dictionary je obsiahnutá vo vnútri System.Collections.Generic menného priestoru. Slovník v podstate obsahuje všeobecnú zbierku párov kľúč / hodnota. Môžete použiť výhodu metódy Add v triede Dictionary na ukladanie objektov v inštancii Dictionary. Slovník je rýchlejší ako hashtable, pretože eliminuje režijné náklady spojené s boxom a unboxingom.

Nasledujúci úryvok kódu ukazuje, ako môžete ukladať a načítať objekty v inštancii slovníka.

Slovník slovníka = nový Slovník ();

dictionary.Add (1, "Joydip");

dictionary.Add (2, "James");

dictionary.Add (3, "Steve");

foreach (KeyValuePair kvp v slovníku)

{

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

}

Základný rozdiel medzi Hashtable a Dictionary je v tom, že zatiaľ čo prvý je nepísaný na stroji a vyžaduje začiarknutie políčka a rozbaľovanie nad hlavou, druhý nie je taký, ako je zadaný. Je medzi nimi ešte jeden rozdiel. Ak použijete indexátor na načítanie hodnoty z inštancie Hashtable a položka neexistuje, vráti sa vám nulová hodnota. Naopak, ak sa pokúsite načítať neexistujúcu položku z inštancie slovníka, bude vyvolaná výnimka. Upozorňujeme, že ani Hashtable, ani slovník by nezaručili zachovanie poradia položiek v zbierke.

Zatiaľ čo Hashtable je slabo napísaná dátová štruktúra, slovník je silne napísaná. Výber medzi Hashtable a Dictionary závisí od toho, či potrebujete typovo bezpečnú zbierku. Vo väčšine prípadov je slovník dobrou voľbou. Zjednodušene povedané, slovník je vylepšená tabuľka hash. Slovník často používam cez Hashtable.

$config[zx-auto] not found$config[zx-overlay] not found