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;
İ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.