Clear        


                
                    using _20_DictionaryCollectionType.Demos;

namespace _20_DictionaryCollectionType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Dictionary (sözlük) List gibi type safe (tip güvenli) bir koleksiyon tipidir.
            // List'ten farklı olarak tip olarak iki aynı veya farklı tipe sahip olabilir.
            // Dictionary üzerinden de pek çok koleksiyon özellik ve methodları kullanılabilir.



            #region Şehirler Dictionary
            // Dictionary<byte, string> tipinde sehirler referans değişkeni üzerinden bir obje oluşturma
            Dictionary<byte, string> sehirler = new Dictionary<byte, string>(); 

            // dictionary'e anahtar (key) ve değer (value) parametreleri üzerinden elemanlar ekleme
            sehirler.Add(6, "Ankara");
            sehirler.Add(34, "İstanbul");
            sehirler.Add(35, "İzmir");

            // dictionary elemanlarını konsola yazdırma: bir aşağıdaki şekilde anahtar (key) değer (value) çifti üzerinden
            // başında [ ve sonunda ] olacak şekilde yazdırır
            foreach (KeyValuePair<byte, string> sehir in sehirler)
            {
                Console.WriteLine(sehir);
            }

            Console.WriteLine();

            // ancak dictionary elemanlarının anahtar ve değerlerine bir aşağıdaki şekilde ayrı ayrı ulaşılabilir 
            foreach (KeyValuePair<byte, string> sehir in sehirler)
            {
                Console.WriteLine("Şehir plakası: " + sehir.Key + ", Şehir adı: " + sehir.Value);
            }

            Console.WriteLine();

            // istenirse dictionary elemanlarının anahtarları index olarak kullanılarak değerlere ulaşılabilir
            Console.WriteLine(sehirler[34]); // konsola İstanbul yazdıracaktır

            // eğer anahtara sahip eleman yoksa beklenmeyen hata (exception) fırlatır
            //Console.WriteLine(sehirler[1]); // Adana şehri dictionary'de olmadığı için beklenmeyen hata fırlatacaktır

            Console.WriteLine();

            // dictionary elemanları içerisinde herhangi bir anahtara sahip eleman olup olmadığı ContinsKey,
            // herhangi bir değere sahip eleman olup olmadığı ise ContainsValue methodlarıyla kontrol edilebilir
            if (sehirler.ContainsKey(7))
                Console.WriteLine("Antalya şehri bulundu.");
            else
                Console.WriteLine("Antalya şehri bulunamadı.");

            // Contains methodları diğer koleksiyon methodlarında olduğu gibi büyük küçük harf duyarlı (case sensitive) arama yapar
            Console.WriteLine(sehirler.ContainsValue("İzmir") ? "İzmir şehri bulundu." : "İzmir şehri bulunamadı.");

            Console.WriteLine();

            // Count özelliği üzerinden bir dictionary'deki eleman sayısına ulaşılabilir
            int sehirSayisi = sehirler.Count;
            Console.WriteLine($"Şehir sayısı: {sehirSayisi}");

            Console.WriteLine();
            #endregion



            #region Ülkeler Dictionary
            // Ülkeler Dictionary'mizi oluşturuyoruz:
            // Dictionary tipinde bir obje initialize edilirken (oluşturulurken) elemanları doldurulabilir.
            Dictionary<string, Ulke> ulkeler = new Dictionary<string, Ulke>()
            {
                {
                    // İstenirse obje default constructor üzerinden oluşturulurken özellikeri atanabilir.
                    "TR", new Ulke()
                    {
                        Adi = "Türkiye",
                        Nufusu = 84780000,
                        Yuzolcumu = 783562
                    }
                },
                { 
                    // İstenirse obje parametreli constructor üzerinden oluşturulabilir.
                    "ABD", new Ulke("Amerika Birleşik Devletleri", 331900000, 9834000)
                }
            };

            // İlk ülke bilgisini konsola yazdırıyoruz:
            string ilkUlkeAnahtari = ulkeler.Keys.FirstOrDefault(); // FirstOrDefault methodu anahtarlar koleksiyonundaki ilk elemanı döner, eleman yoksa null döner.
            Ulke ilkUlke = ulkeler[ilkUlkeAnahtari]; // İlk ülke anahtarı üzerinden ilk Ulke tipindeki objeye ulaşıyoruz.
            string ilkUlkeBilgisi = "İlk Ülke Bilgisi:\n" + // İlk ülke bilgisini ilk Ulke tipindeki obje üzerinden obje özelliklerini kullanarak string tipinde alıyoruz.
                "Kodu: " + ilkUlkeAnahtari + "\n" +
                "Adı: " + ilkUlke.Adi + "\n" +
                "Nüfusu: " + ilkUlke.Nufusu + " kişi\n" +
                "Yüzölçümü: " + ilkUlke.Yuzolcumu + " kilometrekare";
            Console.WriteLine(ilkUlkeBilgisi);

            Console.WriteLine();

            // Tüm ülke bilgilerini konsola yazdırıyoruz:
            Console.WriteLine("Tüm Ülke Bilgileri:");
            foreach (KeyValuePair<string, Ulke> ulke in ulkeler)
            {
                Console.WriteLine(ulke.Value); // Ulke class'ında ToString methodunu override ettiğimiz için parametre olarak Ulke objesini gönderip
                                               // ToString methodundan dönen string'i yazdırabiliriz, parametre olarak ulke.Value.ToString() de yazılabilir.
            }
            #endregion



            #region Demos
            IngilizceTurkceSozlukDemo ingilizceTurkceSozlukDemo = new IngilizceTurkceSozlukDemo();
            ingilizceTurkceSozlukDemo.Calistir();

            TurkceHarfleriIngilizceyeDonusturmeDemo turkceHarfleriIngilizceyeDonusturmeDemo = new TurkceHarfleriIngilizceyeDonusturmeDemo();
            turkceHarfleriIngilizceyeDonusturmeDemo.Calistir();
            #endregion
        }
    }
}