Serdar YILMAZ / Software Developer
Bizimkisi Bir “Bug” Hikayesi...
Kocaeli/Körfez
Serdar Yılmaz C# – Hashtable Sınıfı

C# – Hashtable Sınıfı

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;

  1. Öncellikle depolama işlemi için kullanılacak bir hash tablosu oluşturulur.
  2. 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.
  3. 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

  1. Nesne Oluşturma
    Hashtable sınıfından bir nesne oluşturuyoruz.

                Hashtable Arac = new Hashtable();
    
  2. 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");
    
  3. 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ı."); 
    
  4. 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."); 
    
  5. Clear() Metodu
    Koleksiyon içerisinde yer alan tüm Anahtar-Değer çiftlerini silmektedir.

    Arac.Clear();
    
  6. 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");
    
  7. 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);
    
  8. 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);
    
  9. 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

  1. Öğ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]);
    
  2. Hashtable Koleksiyonu Döndüren Metot

     static Hashtable Koleksiyon()
     {
         Hashtable Arac = new Hashtable();
    
         Arac.Add("41 ABC 123", "Alfa Romeo");
         Arac.Add("56 ABC 456", "Audi");
         Arac.Add("25 ABC 789", "Mercedes-Benz");
    
         return Arac;
     }
    
     static void Main(string[] args)
     {
         // Anahtar-Değer çiftleri ekrana yazdırıldı.
         foreach (DictionaryEntry oge in Koleksiyon())
             Console.WriteLine(oge.Key + "-" + oge.Value);
     }
    

Yazar: Serdar Yılmaz


Bu İçeriği Arkadaşlarınızla Paylaşmak İster misiniz?

6 Yorum

  1. seya
    12 Aralık 2018 de 14:24 · Cevapla

    İ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]));
    }
    }

    • Serdar Yılmaz
      12 Aralık 2018 de 18:39 · Cevapla

      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.

Bir Yorum Yapın