Örneklerle C# Hashtable

⚡ Akıllı Özet

C#'da hashtable, System.Collections ad alanından gelen ve verileri anahtar-değer çiftleri olarak depolayan bir koleksiyondur; burada her benzersiz anahtar bir değere karşılık gelir ve anahtar, depolanan değere hızlı erişim sağlar.

  • 📚 Anahtar-değer çiftleri: Bir hash tablosu, yığın veya dizi listesinin tuttuğu tek bir değer yerine, her eleman için iki değer, bir anahtar ve onun değeri saklar.
  • Öğeler ekleniyor: `Add` metodu, bir anahtar ve bir değeri birlikte ekler ve Hashtable içindeki her anahtar benzersiz olmalıdır.
  • ???? ContainsKey ve ContainsValue: Bu yöntemler true veya false değeri döndürerek bir anahtarın veya değerin zaten mevcut olup olmadığını test etmenizi sağlar.
  • 🔁 Okuma değerleri: ICollection veya DictionaryEntry döngüsüyle birlikte kullanılan Keys özelliği, depolanan her değeri sırayla okumanıza olanak tanır.
  • Yöntemler ve özellikler: Remove, Clear, Count, Keys ve Values ​​işlevleri, Hashtable'ın içeriğini yönetir ve inceler.
  • 🤖 Yapay zeka yardımı: GitHub Copilot, Hashtable kodunun iskeletini oluştururken, modern C# ve ML.NET, tür güvenli anahtar-değer verileri için genel Dictionary yapısını tercih eder.

C# Hashtable

C#'ta Hashtable nedir?

Karma tablosu, anahtar/değer öğelerini depolamak için kullanılan özel bir koleksiyondur. Yani yığın, dizi listesi ve kuyruk gibi tek bir değeri depolamak yerine karma tablosu 2 değeri saklar. Bu 2 değer karma tablosunun bir öğesini oluşturur.

Aşağıda bir karma tablosunun değerlerinin nasıl görünebileceğine dair bazı örnekler verilmiştir.

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

Yukarıda 3 anahtar değer çiftimiz var. Her elemanın tuşları sırasıyla 001, 002 ve 003'tür. Her anahtar değer çiftinin değerleri “. NetSırasıyla “, “C#” ve “ASP.Net”.

Hashtable koleksiyonu için mevcut işlemlere daha ayrıntılı olarak bakalım.

Hashtable Bildirgesi

Bir Hashtable'ın bildirimi aşağıda gösterilmiştir. Hashtable Veri Tipinin yardımıyla bir Hashtable oluşturulur. “Yeni” anahtar sözcüğü bir Hashtable nesnesi oluşturmak için kullanılır. Daha sonra nesne ht değişkenine atanır.

Hashtable ht = new Hashtable()

Hashtable'a öğe ekleme

Add yöntemi, bir öğeyi eklemek için kullanılır. kuyruk. İfadenin genel sözdizimi aşağıda verilmiştir

HashTable.add("key","value")

Örnek 1:

Hash tablosunun her öğesinin 2 değerden oluştuğunu unutmayın; biri anahtar, diğeri değerdir.

Şimdi bunun kod düzeyinde çalıştığını görelim. Aşağıda belirtilen kodların tamamı Konsol uygulamamıza yazılacaktır.

Kod Program.cs dosyamıza yazılacaktır. Aşağıdaki programda yukarıda bahsettiğimiz yöntemleri nasıl kullanabileceğimizi görmek için kod yazacağız.

Şimdilik örneğimizde sadece hashtable'ı nasıl oluşturabileceğimize, hashtable'a nasıl öğeler ekleyebileceğimize ve bunları buna göre nasıl görüntüleyebileceğimize bakacağız.

C# dilinde Hashtable

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code Açıklama:-

  1. Öncelikle “New” anahtar kelimesini kullanarak Hashtable veri tipini kullanarak hashtable değişkenini deklare ediyoruz. Tanımlanan değişkenin adı 'ht'tir.
  2. Daha sonra Add yöntemini kullanarak karma tablosuna öğeler ekliyoruz. Hashtable'a bir şey eklerken hem anahtar hem de değer öğesi eklememiz gerektiğini unutmayın.
  3. Karma tablonun öğelerini görüntülemenin doğrudan bir yolu yoktur.
    • Hashtable'ı görüntülemek için öncelikle hash tablosundan anahtarların (001, 002 ve 003) listesini almamız gerekiyor.
    • Bu ICollection arayüzü aracılığıyla yapılır. Bu, hash tablosu koleksiyonlarının anahtarlarını depolamak için kullanılabilecek özel bir veri türüdür. Daha sonra hash tablosu koleksiyonunun anahtarlarını 'keys' değişkenine atarız.
  4. Daha sonra, her anahtar değer için, ht[k] ifadesini kullanarak hash tablosundaki ilgili değeri elde ederiz.

Yukarıdaki kod düzgün bir şekilde girilip program çalıştırıldığında aşağıdaki çıktı görüntülenecektir.

Çıktı:

C# dilinde Hashtable

Hash tabloları için mevcut bazı yöntemlere bakalım.

Anahtar İçerir

Bu yöntem Hashtable'da bir anahtarın mevcut olup olmadığını görmek için kullanılır. Aşağıda bu ifadenin genel sözdizimi verilmiştir. Anahtar mevcutsa ifade true değerini döndürür, aksi takdirde false değerini döndürür.

Hashtable.Containskey(key)

İçerirDeğer

Bu yöntem Hashtable'da bir Değerin mevcut olup olmadığını görmek için kullanılır. Aşağıda bu ifadenin genel sözdizimi verilmiştir. Eğer Değer mevcutsa ifade true değerini döndürür, aksi halde false değerini döndürür.

Hashtable.ContainsValue(value)

Örnek 2:

Kodumuzdaki kodu değiştirelim Konsol uygulaması “Containskey” ve “ContainsValue” yöntemini nasıl kullanabileceğimizi göstermek için.

C# dilinde Hashtable

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code Açıklama:-

  1. İlk olarak, anahtarın hashtable'da mevcut olup olmadığını görmek için ContainerKey yöntemini kullanıyoruz. Anahtar hash tablosunda mevcutsa bu yöntem true değerini döndürür. Anahtar hash tablosunda mevcut olduğundan bu yöntem true değerini döndürmelidir.
  2. Daha sonra değerin hash tablosunda mevcut olup olmadığını görmek için ContainerValue yöntemini kullanırız. Değer karma tablosunda mevcut olduğundan bu yöntem 'true' değerini döndürecektir.

Yukarıdaki kod düzgün bir şekilde girilip program çalıştırıldığında aşağıdaki çıktı görüntülenecektir.

Çıktı:

C# dilinde Hashtable

Çıktıdan, hem anahtarın hem de aranan değerin karma tablosunda mevcut olduğunu açıkça görebilirsiniz.

C# Hashtable'da Döngü Nasıl Oluşturulur?

Yukarıdaki örnekler, Keys koleksiyonu aracılığıyla değerleri okuyordu, ancak bir Hashtable'ı daha temiz bir şekilde gezmek mümkün. DictionaryEntry üzerinde bir foreach döngüsü, her öğenin anahtarını ve değerini tek bir geçişte birlikte size verir; bu, bir Hashtable'ı okumanın en yaygın yoludur.

) 1 Adım Bir karma tablo oluşturun ve içine üç anahtar-değer çifti ekleyin.

) 2 Adım DictionaryEntry değişkenini kullanarak Hashtable üzerinde döngü oluşturun, ardından her bir girdinin Key ve Value özelliklerini okuyun.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code Açıklama:-

  1. ht adında bir karma tablo oluşturulur ve Add metodu kullanılarak üç anahtar-değer çifti eklenir.
  2. `foreach` döngüsü, her bir öğeyi bir `DictionaryEntry`'ye atar; bu `DictionaryEntry`'nin `Key` ve `Value` özellikleri, çiftin iki yarısını ortaya koyar.

Program çalıştırıldığında, her tuşun yanına değerini yazdırır, örneğin 101 – JavaHashtable'lar ekleme sırasını korumadığından, çiftler eklendikleri sıradan farklı bir sırada görünebilir. Yalnızca anahtarları okumak için Keys koleksiyonu üzerinde, yalnızca değerleri okumak için ise Values ​​koleksiyonu üzerinde döngü yapın.

C# Hashtable Metotları ve Özellikleri

Hashtable sınıfı, çift ekleme ve çıkarma işlemlerinden üyelik kontrolüne ve eleman saymaya kadar ihtiyaç duyacağınız hemen her görevi kapsayan küçük bir yöntem ve özellik kümesi sunar. En kullanışlı üyeler aşağıda listelenmiştir.

Üye Menşei Açıklama
Anahtar ve değeri ekle Yöntem Yeni bir anahtar ve değer çifti ekler; anahtar benzersiz olmalıdır.
Kaldır (anahtar) Yöntem Belirtilen anahtarla eşleşen öğeyi siler.
Temizlemek() Yöntem Hash tablosundaki tüm anahtar-değer çiftlerini siler.
Anahtar İçerir(anahtar) Yöntem Verilen anahtar mevcutsa true değerini döndürür.
Değer İçerir(değer) Yöntem Verilen değer mevcut olduğunda true değerini döndürür.
saymak Varlığınızı Saklanan anahtar-değer çiftlerinin sayısını alır.
Anahtarlar Varlığınızı Tüm anahtarların bir koleksiyonunu döndürür.
Değerler Varlığınızı Tüm değerlerin bir koleksiyonunu döndürür.

Her anahtar karma algoritmasıyla işlendiği için, ContainsKey ve indeksleyici bir öğeyi neredeyse sabit sürede bulur; bu da karma tabloları hızlı aramalar için çok kullanışlı kılan şeydir.

C#'da Hashtable ve Dictionary Arasındaki Fark

Hem Hashtable hem de Dictionary, anahtar-değer çiftlerini saklar ve her ikisi de C#'ın daha geniş ailesine aittir. koleksiyonÖnemli fark tür güvenliğidir ve bu fark, yeni kod yazarken hangisini tercih etmeniz gerektiğine karar verir.

  • Tip güvenliği: Bir Hashtable, her anahtar ve değeri bir nesne olarak saklarken, Dictionary ise aynı işlevi görür. Genel bir yapıda olduğu için derleyici kullandığınız türleri kontrol eder.
  • Ad alanı: Hashtable, System.Collections içinde yer alırken, Dictionary ise System.Collections.Generic içinde yer alır.
  • Boxing: Bir Hashtable, int gibi değer türlerini kutular içine alırken, genel bir Dictionary bunları doğrudan depolar ve bu maliyetten kaçınır.
  • Performans: Sözlükler genellikle daha hızlıdır çünkü bir değer okurken nesneden geri tür dönüştürme işlemine gerek duymazlar.
  • İplik güvenliği: Hashtable şunları sunar: SyncTek bir yazıcı ve birçok okuyucu için kullanılan kronize sarmalayıcı, eşzamanlı kod genellikle ConcurrentDictionary'yi tercih ederken.

Yeni projeler için genel sözlük (Dictionary) önerilen seçenektir, genel olmayan karma tablo (Hashtable) ise çoğunlukla eski kodlarda bulunur.

SSS

`Remove` metodu, belirtilen anahtara sahip öğeyi siler ve `Count` değerini bir azaltır. Anahtar mevcut değilse hiçbir şey olmaz, bu nedenle anahtarın mevcut olduğundan emin olmanız gerekiyorsa önce `ContainsKey` metodunu çağırın.

Hayır. Bir Hashtable'daki her anahtar benzersiz olmalıdır. Zaten var olan bir anahtarla Add yöntemini çağırmak ArgumentException hatası verir. Ancak, aynı değeri herhangi bir hata olmadan birkaç farklı anahtar altında saklayabilirsiniz.

Bir Hashtable, tek bir yazıcının birçok okuyucuyla güvenli bir şekilde çalışmasını destekler. Birden fazla yazma iş parçacığı için, bunu bir Hashtable kullanarak sarmalayın.SyncBunun yerine, harici kilitlere ihtiyaç duymadan eşzamanlı okuma ve yazma işlemlerini yöneten System.Collections.Concurrent'ten ConcurrentDictionary'yi kullanın veya kronize edin.

Anahtar ile bir değere bakma işlemi, anahtarın kovasını bulmak için karma işlemine tabi tutulması nedeniyle ortalama olarak neredeyse sabit O(1) sürede gerçekleşir. Ağır karma çakışmaları işlemi yavaşlatabilir, ancak iyi dağıtılmış anahtarlarda bu nadirdir.

Bir değer boş (null) olabilir, ancak bir anahtar boş olamaz. Add veya dizinleyiciye boş bir anahtar geçirmek ArgumentNullException hatasına neden olur. Her anahtar ayrıca benzersiz olmalı ve saklandığı süre boyunca değişmemelidir.

Hashtable'lar sıralama özelliğini korumaz, bu nedenle yerinde sıralanamazlar. Anahtarlarını bir listeye veya ArrayList'e kopyalayın, bu listeyi sıralayın, ardından değerleri anahtara göre okuyun. SortedList ise girdilerini otomatik olarak sıralı tutar.

Evet. GitHub Copilot, kısa bir yorum veya metot adından Hashtable bildirimleri, Add çağrıları ve DictionaryEntry döngüleri yazar. Genellikle yeni C# kodları için önerilen koleksiyon olduğu için genel Dictionary'yi önerir.

ML.NET eğitim verileri, Hashtable yerine tipli koleksiyonlar ve IDataView işlem hattı üzerinden akar. Bununla birlikte, hash tabanlı anahtar-değer eşlemeleri, makine öğrenimi modeli etrafında özellik aramalarını, sözlük kodlamasını ve önbelleğe almayı desteklemeye devam eder.

Bu yazıyı şu şekilde özetleyin: