“C# – Koleksiyonlar” başlıklı yazımızda koleksiyonların avantajlarından, dezavantajlarından bahsedip, genel bir bilgi vermiştik. Bu yazımızda ise bir koleksiyon sınıfı olan Hashtable‘dan bahsedeceğiz.
Hashtable Sınıfının Temel Yapısı
Standart dizilere eklenen elemanlar, belleğe sıralı bir şekilde yerleştirilmektedir. Sıfırdan başlanarak her bir elemana birer indeks değeri verilip, elemanlara o indeksler aracılığıyla erişmemiz sağlanmaktaydı.
Hashtable koleksiyonunda ise Anahtar(Key) ve Değer(Value) olmak üzere iki kavram karşımıza çıkmakta. Konuyu daha anlaşılır kılmak açısından; standart dizilere eklediğimiz elemanları Değer, o elemanlara erişmek için kullandığımız indeksleri de Anahtar olarak düşünebilirsiniz.
Her bir Değerin farklı bir Anahtarı olmalıdır yani koleksiyon içerisinde yer alan Anahtarlar birbirinden farklı olmalıdır. Şimdi, başlangıç seviyesinde basit bir C# konsol uygulaması hazırlayarak Hashtable Sınıfını incelemeye devam edelim.
Hashtable Arac = new Hashtable(); // Arac.Add(Anahtar,Değer); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); Console.Write("Plaka Giriniz:"); string Plaka = Console.ReadLine(); if (Arac.ContainsKey(Plaka)) Console.WriteLine(Arac[Plaka]); else Console.WriteLine("Araç Bulunamadı.");
Yukarıdaki örneğimizi açıklayacak olursak; Plaka girildiğinde, ilgili aracın markasını ekrana yazan bir uygulama hazırladık. Plaka ile sorgulama yapacağımız için plakaları Anahtar(Key), markaları da Değer(Value) olarak belirttik. Kullanıcı tarafından girilen ifadeyi string tipinde tanımladığımız “Plaka” değişkenine atıp, ContainsKey() metodu ile koleksiyon içerisinde öyle bir Anahtar(Plaka) olup olmadığını sorguladık.
Bir Hashtable koleksiyonu oluşturup, Anahtar-Değer çifti eklemek istediğimizde arkaplanda gerçekleşen işlemler;
- Öncellikle depolama işlemi için kullanılacak bir hash tablosu oluşturulur.
- Anahtar kullanılarak hash kod denilen benzersiz bir değer üretilir (Hashing). Bu değer anahtar ile ilişkili verilerin, hash tablosunda saklanacağı indeksi belirtecektir.
- Anahtar ile ilişkili veriler, hash tablosunda Hash kodunun belirttiği indekse eklenir.
Arkaplanda gerçekleşen tüm bu işlemler büyük veri kümelerini içeren koleksiyonlar da arama süresini ciddi anlamda düşürmektedir.
Metotlar ve Özellikler
- Nesne Oluşturma
Hashtable sınıfından bir nesne oluşturuyoruz.Hashtable Arac = new Hashtable();
- Add(Eklenecek_Anahtar, Eklenecek_Deger) Metodu
Add() metodu ile veri tipi fark etmeksizin koleksiyon içerisine her türlü Anahtar-Değer çiftini ekleyebiliriz.Arac.Add("41 ABC 123", "Alfa Romeo");
- ContainsKey(Aranan_Anahtar) Metodu
Koleksiyon içerisinde, parametre olarak girilen değerde bir Anahtar(Key) mevcutsa TRUE değilse FALSE döndürecektir.Hashtable Arac = new Hashtable(); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); // "41 ABC 123" Anahtarı mevcut olduğu için True Döndürecektir. // Ekrana, "41 ABC 123" Anahtarı ile ilişkili Değeri yazacaktır. (Alfa Romeo) if (Arac.ContainsKey("41 ABC 123")) Console.WriteLine(Arac["41 ABC 123"]); else Console.WriteLine("Araç Bulunamadı.");
- ContainsValue(Aranan_Deger) Metodu
Koleksiyon içerisinde, parametre olarak girilen ifadede bir Değer(Value) mevcutsa TRUE değilse FALSE döndürecektir.Hashtable Arac = new Hashtable(); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); // Koleksiyonda "Audi" Değeri mevcut olduğu için TRUE döndürecektir. // Ekran çıktısı: Mevcut if (Arac.ContainsValue("Audi")) Console.WriteLine("Mevcut"); else Console.WriteLine("Mevcut Değil.");
- Clear() Metodu
Koleksiyon içerisinde yer alan tüm Anahtar-Değer çiftlerini silmektedir.Arac.Clear();
- Remove(Anahtar) Metodu
Koleksiyon içerisinde, parametre olarak girilen değerde bir Anahtar(Key) mevcutsa; Anahtarı ve anahtarla ilişkili Değeri silecektir.Arac.Remove("41 ABC 123");
- Keys Özelliği
Anahtarları (Keys) içeren bir koleksiyon döndürmektedir.Hashtable Arac = new Hashtable(); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); ICollection Koleksiyon = Arac.Keys; foreach (object Anahtar in Koleksiyon) Console.WriteLine(Anahtar); // Veya ArrayList arrayList = new ArrayList(Arac.Keys); foreach (object Anahtar in arrayList) Console.WriteLine(Anahtar);
- Values Özelliği
Değerleri (Values) içeren bir koleksiyon döndürmektedir.Hashtable Arac = new Hashtable(); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); ICollection Koleksiyon = Arac.Values; foreach (object Deger in Koleksiyon) Console.WriteLine(Deger); // Veya ArrayList arrayList = new ArrayList(Arac.Values); foreach (object Deger in arrayList) Console.WriteLine(Deger);
- Count Özelliği
Koleksiyon içerisinde bulunan anahtar-değer çiftlerinin sayısını döndürmektedir.Hashtable Arac = new Hashtable(); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); // Ekran Çıktısı: 3 Console.WriteLine(Arac.Count);
Uygulama
- Öğeleri Listeleme
Hashtable Arac = new Hashtable(); Arac.Add("41 ABC 123", "Alfa Romeo"); Arac.Add("56 ABC 456", "Audi"); Arac.Add("25 ABC 789", "Mercedes-Benz"); // Çözüm 1:Anahtar-Değer çiftleri ekrana yazdırıldı.(Yüksek Performans) foreach (DictionaryEntry oge in Arac) Console.WriteLine(oge.Key + "-" + oge.Value); // Çözüm 2:Anahtar-Değer çiftleri ekrana yazdırıldı. foreach (object Anahtar in Arac.Keys) Console.WriteLine(Anahtar + "-" + Arac[Anahtar]); // Çözüm 3:Anahtar-Değer çiftleri ekrana yazdırıldı. ICollection Koleksiyon = Arac.Keys; foreach (object Anahtar in Koleksiyon) Console.WriteLine(Anahtar + "-" + Arac[Anahtar]);
Yazar: Serdar Yılmaz
teşekkürler faydalı bir yazı
Hashtable Sınıfını anlamamda çok yardımcı oldunuz, teşekkürler.
İyi günler. Konuyu çok kısa ve öz bir şekilde anlattığınız için teşekkür ederim. İzninizle bir soru sormak istiyorum. Tekli isminde bir hashtable kullanıyorum ve hashtable’daki value değerleri limit değerine eşit olan değerleri ve anahtarları silmek istiyorum. Bunun için aşağıdaki gibi bir kod yazdım fakat şu şekilde bir hata alıyorum: “Koleksiyon değiştirildi; sabit listesi işlemi yürütülemeyebilir.” Bu problemi nasıl çözebilirim yardımcı olursanız sevinirim.
Hashtable Tekli =new Hashtable();
int limit = 1;
foreach (object Anahtar in (Tekli.Keys))
{
if(Convert.ToInt32(Tekli[Anahtar]) == limit)
{
Tekli.Remove(Anahtar);
}
else
{
MessageBox.Show(Convert.ToString(Anahtar + “-” + Tekli[Anahtar]));
}
}
Merhaba,
foreach ile Tekli koleksiyonunun elemanlarına erişirken, aynı zamanda koleksiyondaki elemanları silmeye çalıştığınız için program hata vermektedir.
Çözüm
Tekli koleksiyonunun kopyasını alıp, foreach ile kopya koleksiyon üzerinde dolaşırken, silinmesi gereken elemanları Tekli koleksiyonu üzerinden silerek istediğiniz sonucu elde edebilirsiniz.