Dictionary anahtar ve değer ikililerini saklamak için kullandığımız dinamik boyutlu bir yapıdır. Dictionary’de dikkat etmeniz bir kaç önemli kural vardır:
- Anahtar (key) değeri boş (null) olamaz ama değer olabilir
- Anahtar (key) değeri tekil olmalıdır. Eğer aynı değerde anahtarlar için kayıt eklemeye çalışırsanız programınız System.ArgumentException hatası fırlatır.
- Saklanan değerlerin (value) tipleri aynı olmalıdır.
- System.Collections.Generic ad alanını (namespace) projenize dahil etmelisiniz.
- Elemanlar KeyValuePair<TKey, TValue> şeklinde bellekte tutulur.
Örneğimiz için bir tane sözlük benzeri bir yapı oluşturalım:
public enum Dil
{
Turkce,
Ingilizce
}
Dictionary ye Add(Anahar, Değer) metodunu kullanarak örnek veriler ekliyorum:
Dictionary<string, Dictionary<Dil, string>> dictDiller = new Dictionary<string, Dictionary<Dil, string>>();
dictDiller.Add("Aciklama", new Dictionary<Dil, string>() { { Dil.Turkce, "Açıklama" }, { Dil.Ingilizce, "Description" } });
dictDiller.Add("Anahtar", new Dictionary<Dil, string>() { { Dil.Turkce, "Anahtar" }, { Dil.Ingilizce, "Key" } });
dictDiller.Add("Magaza", new Dictionary<Dil, string>() { { Dil.Turkce, "Mağaza" }, { Dil.Ingilizce, "Shop" } });
Burada oluşturmaya çalıştığım mantık: bir tane anahtarım var ve bu anahtarın farklı dillerdeki karşılıklarını bulmaya çalışıyorum. Şimdi elemanları dönüp ekrana yazdıralım:
foreach (KeyValuePair<string,Dictionary<Dil,string>> dictDil in dictDiller)
{
Console.WriteLine(dictDil.Key);
foreach (KeyValuePair<Dil,string> dilAciklama in dictDil.Value)
{
Console.WriteLine("\t {0}: {1}", dilAciklama.Key, dilAciklama.Value);
}
Console.WriteLine();
}
Foreach döngüsü ile dictDiller değişkenindekileri verileri KeyValuePair<string,Dictionary<Dil,string>> objesine atıp dönüyoruz. Her değerin için bir tane Key ve bir tane Value değeri oluyor. Daha sonra da Value değerini (Dictionary<Dil,string>) kendi içinde dönüp ilgili açıklamaları yazdırabiliyoruz.
Bir elamana ulaşmak için dictDiller[Anahtar] kullanabiliriz. Ama eğer anahtar Dictionary de yoksa KeyNotFoundException hatası alırız:
Bir anahtarın Dictionary de olup olmadığını kontrol etmek için ContainsKey(Anahtar) metodunu kullanabiliriz.
if (dictDiller.ContainsKey("Aciklama"))
Console.WriteLine("Anahtar var");
else
Console.WriteLine("Anahtar bulunamadı");
Başka bir yöntem ise TryGetValue(Anahtar, out Değer) metodudur. Eğer ilgili anahtar Dictionary de varsa true döner ve 2. parametrede verdiğimiz değişkenin içine ilgili değeri yazar. Eğer anahtar yoksa false döner ve 2. parametredeki değişkene “null” ataması yapar. İlgili değerlere ulaşmak için bu metodunu kullanmanızı tavsiye ederim.
Dictionary<Dil, string> dictAciklama;
if (dictDiller.TryGetValue("Aciklama", out dictAciklama))
{
Console.WriteLine("Anahtar bulundu. Değerleri: ");
foreach (KeyValuePair<Dil,string> dilAciklama in dictAciklama)
{
Console.WriteLine("\t {0}: {1}", dilAciklama.Key, dilAciklama.Value);
}
}
else
Console.WriteLine("Anahtar bulunamadı");
Bir eleman çıkarmak için Remove(Anahtar) metodunu kullanabiliriz. Eğer anahtar varsa silip true değeri döner eğer yoksa false değeri döner ve hata fırlatmaz.
if (dictDiller.Remove("Anahtar"))
Console.WriteLine("Silindi");
else
Console.WriteLine("Silinemedi");
Eğer Dictionary deki bütün elemanları silmek istiyorsak Clear() metodunu kullanabiliriz.
dictDiller.Clear();
Son olarak bütün anahtar değerlerini Keys ile dönebilirsiniz, ve Values özelliği ile de bütün değerlerine ulaşabilirsiniz.
foreach (string anahtar in dictDiller.Keys)
{
Console.WriteLine(anahtar);
}
Uygulamada kullandığım tüm kodları sırasıyla aşağıda paylaştım. Umarım Dictionary mantığını anlatabilmişimdir.
public enum Dil
{
Turkce,
Ingilizce
}
static void Main(string[] args)
{
Dictionary<string, Dictionary<Dil, string>> dictDiller = new Dictionary<string, Dictionary<Dil, string>>();
dictDiller.Add("Aciklama", new Dictionary<Dil, string>() { { Dil.Turkce, "Açıklama" }, { Dil.Ingilizce, "Description" } });
dictDiller.Add("Anahtar", new Dictionary<Dil, string>() { { Dil.Turkce, "Anahtar" }, { Dil.Ingilizce, "Key" } });
dictDiller.Add("Magaza", new Dictionary<Dil, string>() { { Dil.Turkce, "Mağaza" }, { Dil.Ingilizce, "Shop" } });
foreach (KeyValuePair<string, Dictionary<Dil, string>> dictDil in dictDiller)
{
Console.WriteLine(dictDil.Key);
foreach (KeyValuePair<Dil, string> dilAciklama in dictDil.Value)
{
Console.WriteLine("\t {0}: {1}", dilAciklama.Key, dilAciklama.Value);
}
Console.WriteLine();
}
if (dictDiller.ContainsKey("Aciklama"))
Console.WriteLine("Anahtar var");
else
Console.WriteLine("Anahtar bulunamadı");
Dictionary<Dil, string> dictAciklama;
if (dictDiller.TryGetValue("Aciklama", out dictAciklama))
{
Console.WriteLine("Anahtar bulundu. Değerleri: ");
foreach (KeyValuePair<Dil, string> dilAciklama in dictAciklama)
{
Console.WriteLine("\t {0}: {1}", dilAciklama.Key, dilAciklama.Value);
}
}
else
Console.WriteLine("Anahtar bulunamadı");
if (dictDiller.Remove("Anahtar"))
Console.WriteLine("Silindi");
else
Console.WriteLine("Silinemedi");
foreach (string anahtar in dictDiller.Keys)
{
Console.WriteLine(anahtar);
}
Console.ReadKey();
}