Rad s Hashtable-om i rječnikom na C #

Microsoft .Net Framework pruža izvrsnu podršku za rad sa zbirkama. Zbirke se koriste za pohranu i pronalaženje podataka. Koristite zbirke u svojoj aplikaciji za dinamičko dodjeljivanje memorije za spremanje elemenata, a zatim ih dohvaćate pomoću ključa ili indeksa prema potrebi. U osnovi, zbirka predstavlja skup objekata kojima možete pristupiti ponavljanjem svakog od elemenata zbirke.

Hashtable

Tipovi u prostoru imena System.Collections pohranjuju podatke kao objekte tipa Object. Hashtable predstavlja strukturu podataka koja može pohraniti objekte kao parove ključnih vrijednosti. Vrijednost možete potražiti u primjerku klase Hashtable pomoću odgovarajućeg ključa. Imajte na umu da su i ključ i vrijednost pohranjeni u instanci Hashtable-a tipa objekta. Imajte na umu da ključ ne može biti null. U svakom slučaju možete sačuvati null vrijednost. Sljedeći popis koda ilustrira kako možete pohraniti i dohvatiti ključeve / vrijednosti iz instance Hashtablea.

static void Main()

       {

           Hashtable hashTable = new Hashtable();

           hashTable.Add(1, "Joydip");

           hashTable.Add(2, "James");

           hashTable.Add(3, "Steve");

           Console.WriteLine("The key / value pairs are:--");

           foreach (int key in hashTable.Keys)

           {

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

           }

           Console.Read();

       }

Također možete iskoristiti metodu GetEnumerator () klase Hashtable, a zatim nabrojati kolekciju da biste dohvatili parove ključ / vrijednost koji su u njoj pohranjeni. Evo isječka koda koji to ilustrira.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

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

}

Također možete iskoristiti klasu DictionaryEntry za ponavljanje stavki u tablici raspršivanja. Sljedeći isječak koda ilustrira kako se to može učiniti.

Hashtable hashTable = new Hashtable();

hashTable.Add(1, "Joydip");

hashTable.Add(2, "James");

hashTable.Add(3, "Steve");

foreach (DictionaryEntry dictionaryEntry in hashTable)

{

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

}

Pretraživanje stavke u Hashtableu brže je u usporedbi s drugim generičkim zbirkama - shvatimo zašto. Snimka u tablici raspršivanja u skupinama (svaka skupina može sadržavati više zapisa) pomoću hash tipki. Hash ključ se pak generira automatski pomoću algoritma za raspršivanje. MSDN kaže: "Kada se element doda u tablicu raspršivanja, element se stavlja u skup na temelju hash koda ključa. Sljedeća pretraživanja ključa koriste hash kôd ključa za pretraživanje samo u jednom određenom segmentu, čime se znatno smanjuje broj ključnih usporedbi potrebnih za pronalaženje elementa. "

Rječnik

Neke od važnih klasa u System.Collections.Generic namsepaceu uključuju: List, Queue, HashSet, LinkedList, Stack, LinkedListNode i Dictionary. Klasa Rječnik u C # predstavlja generičku strukturu podataka koja može sadržavati ključeve i vrijednosti podataka. Dakle, možete pohraniti podatke bilo koje vrste u instancu Rječnika.

Imajte na umu da dok ICollection sučelje proširuje IEnumerable sučelje, i IDictionary i IList sučelja proširuju ICollection sučelje. Klasa Dictionary nalazi se unutar prostora imena System.Collections.Generic. U osnovi, Rječnik sadrži generičku zbirku parova ključ / vrijednost. Možete iskoristiti metodu Dodaj klase Rječnik za spremanje objekata u instancu Rječnika. Rječnik je brži od tablice s raspršivačem, jer eliminira režije boksa i uklanjanja boksa.

Sljedeći isječak koda pokazuje kako možete pohraniti i dohvatiti objekte unutar instance Rječnika.

Dictionary dictionary = new Dictionary();

dictionary.Add(1, "Joydip");

dictionary.Add(2, "James");

dictionary.Add(3, "Steve");

foreach (KeyValuePair kvp in dictionary)

{

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

}

Osnovna razlika između Hashtable-a i Rječnika je u tome što dok je prvi netipkan i zahtijeva boks i un-boxing troškove, drugi ne kao što je upisan. Među njima postoji još jedna razlika. Ako koristite indeksator za dohvaćanje vrijednosti iz instance Hashtable, a stavka ne postoji, vratit će vam se null vrijednost. Suprotno tome, ako pokušate dohvatiti nepostojeću stavku iz instance Rječnika, pojavit će se izuzetak. Imajte na umu da ni Hashtable ni Rječnik ne bi jamčili očuvanje redoslijeda predmeta u zbirci.

Iako je Hashtable slabo tipizirana struktura podataka, Rječnik je jako tipizirana. Izbor između Hashtable-a i Rječnika ovisi o tome trebate li sigurnu zbirku tipova. U većini slučajeva rječnik je dobar izbor. Jednostavno rečeno, Rječnik je poboljšani Hashtable. Često koristim Rječnik preko tablice s raspravom.