Hashtable Koleksiyon Sýnýfýnýn Kullanýmý

Bu makalemizde HashTable koleksiyon sýnýfýný incelemeye çalýþacaðýz. Bildiðiniz gibi Koleksiyonlar System.Collections namespace'inde yer almakta olup, birbirlerinin ayný veya birbirlerinden farklý veri tiplerinin bir arada tutulmasýný saðlayan diziler oluþturmamýza imkan saðlamaktadýrlar. Pek çok koleksiyon sýnýfý vardýr. Bugün bu koleksiyon sýnýflarýndan birisi olan HashTable koleksiyon sýnýfýný inceleyeceðiz.

HashTable koleksiyon sýnýfýnda veriler key-value dediðimiz anahtar-deðer çiftleri þeklinde tutulmaktadýrlar. Tüm koleksiyon sýnýflarýnýn ortak özelliði barýndýrdýklarý verileri object tipinde olmalarýdýr. Bu nedenle, HashTable'lardada key ve value deðerleri herhangibir veri tipinde olabilirler. Temel olarak bunlarýn her biri birer DictionaryEntry nesnesidir. Bahsetmiþ olduðumuz key-value çiftleri hash tablosu adý verilen bir tabloda saklanýrlar. Bu deðer çiftlerine eriþmek için kullanýlan bir takým karmaþýk kodlar vardýr.

Key deðerleri tektir ve deðiþtirilemezler. Yani bir key-value çiftini koleksiyonumuza eklediðimizde, bu deðer çiftinin value deðerini deðiþtirebilirken, key deðerini deðiþtiremeyiz. Ayrýca key deðerleri benzersiz olduklarýnda tam anlamýyla birer anahtar alan vazifesi görürler. Diðer yandan value deðerline null deðerler atayabilirken, anahtar alan niteliðindeki Key deðerlerine null deðerler atayamayýz. Þayet uygulamamýzda varolan bir Key deðerini eklemek istersek ArgumentException istisnasý ile karþýlaþýrýz.

HashTable koleksiyonu verilere hýzý bir biçimde ulaþmamýzý saðlayan bir kodlama yapýsýna sahiptir. Bu nedenle özellikle arama maliyetlerini düþürdüðü için tercih edilmektedir. Þimdi konuyu daha iyi pekiþtirebilmek amacýyla, hemen basit bir uygulama geliþtirelim. Uygulamamýzda, bir HastTable koleksiyonuna key-value çiftleri ekliyecek, belirtilen key'in sahip olduðu deðere bakýlacak, tüm HashTable'ýn içerdiði key-value çiftleri listelenecek, eleman çiftlerini HashTable'dan çýkartacak vb... iþlemler gerçekleþtireceðiz. Form tasarýmýný ben aþaðýdaki þekildeki gibi yaptým. Temel olarak teknik terimlerin türkçe karþýlýðýna dair minik bir sözüðü bir HashTable olarak tasarlayacaðýz.


Þekil 1. Form Tasarýmýmýz.

Þimdi kodlarýmýza bir göz atalým.

System.Collections.Hashtable htTeknikSozluk; /* HashTable koleksiyon nesnemizi tanimliyoruz.*/

private void Form1_Load(object sender, System.EventArgs e)
{
     htTeknikSozluk=new System.Collections.Hashtable();
/* HashTable nesnemizi olusturuyoruz.*/
    stbDurum.Text=htTeknikSozluk.Count.ToString();
/* HashTable'imizdaki eleman sayisini Count özelligi ile ögreniyoruz.*/
}

private void btnEkle_Click(object sender, System.EventArgs e)
{
    
try
    
{
        
htTeknikSozluk.Add(txtKey.Text,txtValue.Text);/* HashTable'imiza key-value çifti ekleyebilmek için Add metodu kullaniliyor.*/
        lstAnahtar.Items.Add(txtKey.Text);
        stbDurum.Text=htTeknikSozluk.Count.ToString();
    
}
    catch(System.ArgumentException)
/* Eger var olan bir key'i tekrar eklemeye çalisirsak bu durumda ArgumentException istisnasi     firlatilacaktir. Bu durumda, belirtilen key-value çifti HashTable koleksiyonuna eklenmez. Bu durumu kullaniciya bildiriyoruz.*/
    {
        
stbDurum.Text=txtKey.Text+" Zaten HashTable Koleksiyonunda Mevcut!";
    }
}

private void lstAnahtar_DoubleClick(object sender, System.EventArgs e)
{
    string deger;

    deger=htTeknikSozluk[lstAnahtar.SelectedItem.ToString()].ToString();
/* HashTable'daki bir degere ulasmak için, köseli parantezler arasinda aranacak key degerini giriyoruz. Sonucu bir string degiskenine aktariyoruz.*/

    MessageBox.Show(deger,lstAnahtar.SelectedItem.ToString());
}

private void btnSil_Click(object sender, System.EventArgs e)
{
    if(htTeknikSozluk.Count==0) 
    {
        stbDurum.Text="Çikartilabilecek hiç bir eleman yok";
    
}
    else if(lstAnahtar.SelectedIndex==-1)
    {
        stbDurum.Text="Listeden bir eleman seçmelisiniz";
    }
    else
    {
        
htTeknikSozluk.Remove(lstAnahtar.SelectedItem.ToString()); /* Bir HashTable'dan bir nesneyi çikartmak için, Remove metodu kullanilir. Bu metod parametre olarak çikartilmak istenen deger çiftinin key degerini alir.*/

        lstAnahtar.Items.Remove(lstAnahtar.SelectedItem);

        stbDurum.Text="Çikartildi";

        stbDurum.Text=htTeknikSozluk.Count.ToString();
    
}
}

private void btnTumu_Click(object sender, System.EventArgs e)
{

    lstTumListe.Items.Clear(); /* Asagidaki satirlarda, bir HashTable koleksiyonu içinde yer alan tüm elemanlara nasil erisildigini görmekteyiz. Keys metodu ile HashTable koleksiyonumuzda yer alan tüm anahtar degerlerini (key'leri), ICollection arayüzü(interface) türünden bir nesneye atiyoruz. Foreach döngümüz ile bu nesne içindeki her bir anahtari, HashTable koleksiyonunda bulabiliyoruz.*/

    ICollection anahtar=htTeknikSozluk.Keys; foreach(string a in anahtar)
    {
        lstTumListe.Items.Add(a+"="+htTeknikSozluk[a].ToString());
    
}
}

Þimdi uygulamamýzý çalýþtýralým.


Þekil 2. Programýn Çalýþmasnýnýn sonucu.

Geldik bir makalemizin daha sonuna. Bir sonraki makalemizde görüþmek dieðiyle hepinize mutlu günler dilerim.