31 Temmuz 2008 Perşembe

Hashtable Koleksiyonu

Koleksiyonlar, dizilerin kullanımına esneklik sağlayan wrapper sınıflardır. System.Collections isimalanı (namespace) altında yer alan koleksiyon sınıflarından birisi olan Hashtable, verileri Key<->Value çiftleri şeklinde saklar.
Hashtable'da Key'ler ve Value'lar birçok koleksiyonda olduğu gibi object tipindendir. 
Hashtable içerisinde bulunan her üye 'DictionaryEntry' tipindendir.DictionaryEntry'ler, Key<->Value çiftlerinden oluşan tiplerdir.


Hashtable koleksiyonuna üye eklemek için .Add() methodunu kullanırız. Add() methodu çalışmak için object tipinden iki parametre ister. Bu değerlerden ilki key, ikincisi value olarak kullanılır. Eklenmek istenen Key ve Value çiftinden DictionaryEntry oluşturulur. DictionaryEntry hazırlandıktan sonra koleksiyona dahil edilir. Value olarak gönderdiğimiz değer koleksiyonda asıl saklamak istediğimiz veridir. Key değeri ise bu veriye ulaşmak istediğimizde kullanmamız gereken anahtar kelimedir.


Object tipinden olan key değeri unique (eşsiz) olmalıdır, koleksiyonda varolan bir key kullanarak yeni bir üye eklemesi yapmak istediğimizde Exception (ArgumentException) alırız. Key değeri olarak null kullanmak istediğimizde de yine Exception (ArgumentNullException) ile karşılaşırız. Key olarak null kullanamayız fakat value null olabilir. Key değeri tanımlandıktan sonra tekrar değiştirilmesi mümkün değildir, fakat herhangi bir üyenin Value'su daha sonra değiştirilebilir.


Hashtable, verileri okumak istediğimizde en hızlı biçimde ulaşabileceğimiz şekilde saklar. Bu bize okuma sırasında performans olarak geri döner. Okuma performansını artırmak istediğimizde Hashtable koleksiyonunu tercih etmeliyiz.



Hashtable koleksiyon nesnesini nasıl örnekleyebilirim?
Bunun için öncelikle using System.Collections; ifadesini kod sayfamızın başına eklemeliyiz. Sonrasında aşağıdaki gibi nesnemizi örnekleyebiliriz.

Hashtable ht = new Hashtable();



Hashtable koleksiyonuna nasıl üye ekleyebilirim?
.Add() methodunu aşağıdaki gibi kullanarak koleksiyona bir key<->value çifti ekleyebilirsiniz.
ht.Add(keyDegiskeni,valueDegiskeni);
Burada keyDegiskeni ve valueDegiskeni olarak tanimlanan yerlere istenilen değerler gönderilebilir. (Örn: Sql'den çektiğimiz bir veri ya da TextBox'lardan gelen değerler)


Hashtable'ın istediğim bir üyesini nasıl okuyabilirim?
Hashtable değişkeni üzerinden indexleyici yardımıyla key'i girip value okunabilir.

object valueDegeri = ht[keyDegeri];
keyDeğeri olarak, okumak istediğimiz veriye ait, daha önceden eşleştirme yaptığımız anahtarı girmemiz gerekir. Indexleyiciden geriye verdiğimiz key'in karşılığı olan value gelecektir.

Hashtable'ın istediğim bir üyesinin value'sunu nasıl değiştirebilirim?
Hashtable değişkeni üzerinden indexleyici yardımıyla key'i verip bu key üzerine yeni value ataması yapılabilir.

ht[keyDegeri] = valueDegeri;
keyDegeri olarak, değiştirmek istediğimiz veriye ait anahtarı gireriz, valueDegeri olarak ta bu key'e sahip üyeye atamak istediğimiz yeni değer gönderilmelidir.

Hashtable üyelerini tek tek ele alıp işlemek için ne yapmalıyım?
Hashtable içerisindeki her üye DictionaryEntry tipindendir. Bir foreach döngüsü ile üyeler arasında gezerken eldeki üye olan DictionaryEntry üzerinden üyenin key ve value değerlerine ulaşılabilir.

foreach (DictionaryEntry entry in ht)
{
    Console.WriteLine(entry.Key + " / " + entry.Value);
}
Value değerlerine ulaşmanın başka bir yolu da Hashtable'ın Keys koleksiyonunda dönmek ve elde edilen key'ler üzerinden value'ları ele almaktır.

foreach (Object keyDegeri in ht.Keys)
{
    Console.WriteLine(
ht[keyDegeri].ToString());}



Hashtable'dan üye çıkartmak için ne yapmalıyım?
.Remove() methodunu kullanarak Hashtable içerisinden bir nesnenin kaldırılmasını sağlayabiliriz. .Remove() methodunu kullanırken, koleksiyondan çıkartmak istediğimiz üyenin key değerini methoda parametre olarak göndermemiz yeterli olacaktır.

ht.Remove(keyDegeri);


Hashtable içerisindeki eleman sayısını nasıl elde edebilirim?
Hashtable içerisindeki .Count özelliğini okuyarak eleman sayısını elde edebiliriz.

Console.WriteLine(ht.Count);


Koleksiyon içerisinde varolan bir key ile üye eklemek istediğimde neden exception alırım?
Varolan bir key'i tekrar ekleyemeyiz çünkü verileri okumak istediğimizde index olarak keyleri kullanacağız. Bu durumda içeride aynı key den 2 tane olursa, biz value'ya ulaşmak için key'i verdiğimizde hangi value'nun döndürüleceğine karar verilemez. Böyle bir sorunla karşılaşmamak için aynı key'in 2 kez girilmesi Exception ile engellenmiştir.

Hiç yorum yok: