Clear        


                
                    using System.Collections;

namespace _17_ArrayListCollectionType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Collections (koleksiyonlar) dinamik array (dizi) objeleridir.
            // Dizilerin eleman sayıları sabitken koleksiyonların eleman sayıları eleman ekleme
            // ve çıkarma işlemlerine göre dinamik olarak değişir.
            // ArrayList, List, Dictionary ve Hashtable başlıca bazı koleksiyon tipleridir.
            // Queue (ilk eklenen ilk çıkar) ve Stack (ilk eklenen son çıkar) ise
            // ihtiyaca özel kullanılabilecek koleksiyon tiplerindendir.



            #region Arrays
            string[] isimler = new string[3];
            isimler[0] = "Angel";
            isimler[1] = "Leo";
            isimler[2] = "Luna";

            //isimler[3] = "Çağıl"; // index out of bounds (index dizi sınırının dışındadır)
            // run-time exception (çalışma zamanı beklenmedik hatası) fırlatacaktır
            // çünkü dizi 3 eleman tutabilecek şekilde tanımlanmıştır

            Console.WriteLine("*** Arrays ***");

            Console.WriteLine("İsimler Dizisi:");

            // 3 elemanlı isimler dizisini konsola yazdırma
            foreach (string isim in isimler)
            {
                Console.WriteLine(isim);
            }

            Console.WriteLine();

            // isimler dizisine yeni bir eleman ekleyebilmenin tek yolu yeniden 4 elemanlı şekilde new'lemektir,
            // ancak bu doğru bir yöntem değildir çünkü daha önce isimler referans değişkeni 3 elemanlı bir diziyi
            // refere ederken tekrar new'lediğimizde 4 elemanlı bir diziyi refere edecektir,
            // dolayısıyla hafızada 3 elemanlı ve 4 elemanlı iki tane dizi için yer ayrılacaktır
            isimler = new string[4];

            // yeni bir dizi oluşturduğumuzdan elemanlarını tekrar doldurmalıyız
            isimler[0] = "Angel";
            isimler[1] = "Leo";
            isimler[2] = "Luna";

            isimler[3] = "Çağıl"; // yeni elemanı diziye eklemiş olduk

            // 4 elemanlı isimler dizisini konsola yazdırma
            foreach (string isim in isimler)
            {
                Console.WriteLine(isim);
            }

            Console.WriteLine();

            // elemanları dinamik olarak yönetebilmek için (ekleme ve çıkarma)
            // dizi kullanmak yerine koleksiyon kullanmak doğrudur
            #endregion



            #region ArrayList Collection Type
            // ArrayList bir class'tır ve dinamik olarak bir koleksiyonu yönetebilmemizi sağlar,
            // içerisinde obje elemanları tutar

            // ArrayList objesini initialize ederken (oluştururken) elemanlarını doldurma
            ArrayList isimListesi = new ArrayList() 
            {
                "Angel",
                "Leo",
                "Luna"
            };

            Console.WriteLine("*** ArrayList ***");

            Console.WriteLine("İsimler Koleksiyonu:");

            // 3 elemanlı ArrayList objesini konsola yazdırma
            foreach (string isimElemani in isimListesi) // foreach (var isimElemani in isimListesi) şeklinde var da kullanılabilir
            {
                Console.WriteLine(isimElemani);
            }

            // isimListesi referans değişkeni üzerinden objeyi oluşturduktan sonra yeniden new'leme yapmadan
            // ve daha önce eklediklerimizi kaybetmeden istediğimiz kadar yeni eleman ekleyebiliriz
            isimListesi.Add("Çağıl");

            Console.WriteLine();

            // 4 elemanlı ArrayList objesini konsola yazdırma,
            // tıpkı array'lerde olduğu gibi collection'larda index üzerinden istenilen elemana ulaşılabilir

            for (int i = 0; i < isimListesi.Count; i++) // array'lerde eleman sayısı için Length özelliği kullanılırken
                                                        // collection'larda Count özelliği kullanılır
            {
                Console.WriteLine(isimListesi[i]);
            }

            Console.WriteLine();
            
            Console.WriteLine($"3. index'teki eleman: {isimListesi[3]}"); // konsola "3. index'teki eleman: Çağıl" yazdıracaktır

            Console.WriteLine();

            // eğer çalıştığımız koleksiyon elemanları type safe değilse (yani elemanların tiplerini bilmiyorsak)
            // ArrayList kullanırız, dolayısıyla istediğimiz tipte eleman ekleyebiliriz
            isimListesi.Add(43);
            isimListesi.Add('E');
            isimListesi.Add(true);
            isimListesi.Add(1.75);

            // 8 elemanlı ArrayList objesini konsola yazdırma
            foreach (var isimElemani in isimListesi)
            {
                Console.WriteLine(isimElemani);
            }
            #endregion
        }
    }
}