Mesut KOSUCU
Savrulma Düşlerim, Borandır Bu... RSS 2.0   
Mesut
İletişim
mkosucu@gmail.com
 Tuesday, January 22, 2008
Hashtable Kullanımı

Bu kısa yazıda System.Collection.Hashtable sınıfını kullanarak iki boyutlu veriyi nasıl saklayacağımız, veriye nasıl erişeceğimizden  bahsedeceğim.

Öncelikle, genelde yazılım içinde veri saklayacağım zaman çok boyutlu veya tek boyutlu dizileri kullanarak, yapmak istediklerimi yapabiliyordum. Ama bazen dizilerin ihtiyaçlarımızı karşılamadığı zamanlar oluyor. Bu durumda Hashtable denen sınıfa başvurarak, daha esnek veri saklayabiliyoruz.

Nedir bu Hashtable? Hashtable, iki boyutlu veri saklayıp, bu verilere KEY ve VALUE özellikleri ile ulaşabileceğimzi bir yapıdır. Örneğin bir kurumsal uygulamada, Müşteri Temsilcisinin SicilNo ve Aldığı Primi tutup işlem yapmanız gerekiyor(bu örnek gerçek olduğu için veriyorum, aynı durumu yaşadım). Bu durumda oluşturacağınız bir Hashtable a KEY değerine SicilNo'yu, VALUE değerine ise Primi kaydedip işlemlerinizi yapabilir ve bu tabloda SicilNo vererek, Prim'e ulaşabilirsiniz.Yani;

SicilNO Prim
1000 1000
1001 5000
1002 4550
1003 7899


İyide ben bunu Array kullanarak yaparım derseniz, işte Array ile Hashtable arasındaki bir kaç temel fark;

1) Array'a değere ulaşmak için index belirtmek durumundasınız, burda KEY özelliğini vererek değere ulaşabilirsiniz. Böylece değerin hangi indexte tutulduğunu bilmek durumda kalmazsınız.

2) Array tanımlarken, array üzerinde tutacağınız element sayısını başta belirtmek durumundasınız. Hashtable de buna gerek yoktur. İsterseniz belirtebilirsiniz, belirtmezseniz Hashtable 'ın boyutu sizin eklediğiniz element sayısı kadar olur.

3) Array de tek tip veri tutabilirsiniz, INT, STRING veya herhangi bir tip, buna karşılık Hashtable da tuttuğunuz verinin tipi önemli değildir. İstediniz her tip veriyi saklayabilirsiniz.

Not: Hashtable tablosu, değerleri "hash code" olarak sakladığından, sıralama(sorting) özelliğini desteklememektedir.

Şimdi C# Kullanarak nasıl bir Hashtable oluşturup ve bu tabloya nasıl değer ekleyeceğimize ve eklediğimiz değerleri nasıl alacağımıza bakalım.

Öncelikle Hashtable sınıfının bi örneğini oluşturalım;

System.Collections.Hashtable _table = new System.Collections.Hashtable();

Hashtable onbeş tane yapılandırıcıya(constructor) sahiptir. Bunlardan önemli bir kaçından bahsetmek gerekirse;

Örneğin tablonuzun kapasitesini belirtmek istiyorsunuz bunu yapmak için aşağıdaki kodu kullanabilirsiniz

 System.Collections.Hashtable _table = new System.Collections.Hashtable(4);

Veya, tablonuzda fazla veri ile çalışıyorsanız ve perfomans sizin için önemli ise, tablonuzda loadfactor ekleyebilirsiniz.

 System.Collections.Hashtable _table = new System.Collections.Hashtable(4,float(.6));

Peki bu loadfactor nedir? Load factor, temel olarak tablonuzun hangi doluluk oranına ulaştığında yeniden yaratılıp mevcut verileri yerlerine koyup, yeni veriyi tabloya ekleyeceğini gösterir. Örneğin, siz loadfactor' u 0.6 verdiğinizde, bu tablonuzun %60 doluluk oranına ulaştığında tablo yeniden yaratılıp eklemeye devam edeceğini gösterir. Kaynaklarda, önerilen loadfactor %60 olarak belirtilmektedir.

Yukarıdaki gibi bir Hashtable oluşturduktan sonra, tablomuza eklemeleri aşağıdaki gibi yapabilriz.

_table.Add(1000, 1000);
_table.Add(1001, 5000);
_table.Add(1002, 4550);
_table.Add(1003 7899);

Bu işlemin sonucunda, yukarıdaki SicilNO-Prim tablosu yapısını oluşturmuş olduk. Şimdi bu tablodan istediğimiz sicil numarasını vererek bu kişinin prim bilgisine ulaşabiliriz. Örneğin 1000 sicil numaralı kişinin prim bilgisini mesaj kutusunda göstermek istiyorsak, aşağıdaki kodu yazmamız yeterlidir.

MessageBox.Show(_table[1001].ToString());

Bunun yanında, Hashtable'a kaydedilen her değer element bir DictionartEnrty(System.Collection.DictionaryEntry)' dir. Eğer tablomuz içindeki elementleri ve değerleri bir döngü yardımı ile almak istiyorsak, bunun için iki yol kullanabiliriz.

1) foreach (DictionaryEntry _dic in _table)
    {
         MessageBox.Show(_dic.Key.ToString());
         MessageBox.Show(_dic.Value.ToString());
    }

2) IDictionaryEnumerator _enum = _table.GetEnumerator();                                                       

     while (_enum.MoveNext())
     {
            MessageBox.Show(_enum.Key.ToString());
            MessageBox.Show(_enum.Value.ToString());
      }

Bu iki yöntemi kullanarak tablonuzdaki değerlere ulaşmanız mümkün.

Bu yazıda kısaca Hashtable kullanımını anlatmaya çalıştım. Umarım  faydalı olur. Herhangi bir sorunuz olduğunda cevaplamaktan mutluluk duyarım.

İyi Çalışmalar.

 

Tuesday, January 22, 2008 2:44:37 AM (GMT Standard Time, UTC+00:00)  #    Comments [1] -


Visual Studio
Tuesday, January 22, 2008 11:12:50 AM (GMT Standard Time, UTC+00:00)
Merhaba Mesut;

bu yararlı bilgileri bizlerle paylaştığın için teşekkürler. bahsettiğin gibi iki boyutlu değişken kullandığımızda array ler kullanışlı gelirdi. ama artık sayende hashtable class ını kullanacağımdan emin olabilirsin.

hem o kadar sade ve anlaşılır bir dil kullanmışsın ki; eski projeleri yeniden derlemeyi bile düşünmeye başladım:)

emeğine sağlık...
Mustafa GUNES
Comments are closed.
Kategoriler
 Genel
 jQuery
 Politika
 Teknoloji
 Visual Studio
Navigasyon
The Code Project
Developer Express Inc.
ASP.NET
Martin Fowler
WindowsClient.net
Takip Ettiklerim
 ASP.NET Daily Articles
 ASP.NET How Do I? Videos
 Engineering Windows 7
 Hasan Ayaz
 Hasan Ayaz / Technojection
 Kıvanç Özüölmez
 Latest Microsoft Blogs
 Martin Fowler
 Mehmet Nuri Çankaya
 Murat Yılmaz
 Tamer Öz
Arşiv
<November 2008>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456