Clear        


                
                    using _18_CollectionMethods;
using _18_CollectionMethods.Demos._1_SayiTekillik;
using _18_CollectionMethods.Demos._2_IsimBulma;
using _18_CollectionMethods.Demos._3_Organizasyonlar;

namespace _19_CollectionMethodsAndProperties
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Koleksiyon method ve özelliklerinin çoğu tüm koleksiyon tipleri için kullanılabilir.
            // string de karakter dizisi (koleksiyonu) olduğu için bazı method ve özellikler string için de kullanılabilir.



            #region I) Koleksiyon Method ve Özellikleri

            // Aşağıdaki Örnekler için Değişken Tanım ve Atamaları
            List<int> sayilar = new List<int>() // bir koleksiyonda bir veya daha fazla eleman olabilir veya hiç eleman olmayabilir
            {
                5, 2, 3, 4, 1, 5
            };

            List<Kopek> kopekler = new List<Kopek>()
            {
                new Kopek("Angel", "İrlanda Seteri", 15, false)
            };

            List<string> oyuncular; // aşağıda Şener Şen, Kemal Sunal ve Adile Naşit olarak oluşturlacak



            #region Count Özelliği Örnekleri
            // Count Özelliği Örnek 1: Count bir koleksiyondaki eleman sayısını döner.
            Console.WriteLine("1) Sayılar Koleksiyonu Eleman Sayısı (Count): " + sayilar.Count);



            // Count Özelliği Örnek 2
            Console.WriteLine("\n2) Köpekler Koleksiyonu Eleman Sayısı (Count): " + kopekler.Count);
            #endregion



            #region Add ve AddRange Method Örnekleri
            // Add Methodu Örnek 1
            sayilar.Add(7);
            sayilar.Add(6);

            Yazdir("3)", sayilar);



            // Add Methodu Örnek 2
            Kopek yeniKopek = new Kopek("Leo", "Sheltie", 8, true); // 1. yöntem: methoda parametre olarak daha önceden
                                                                    // new'lenmiş bir objenin referans değişkeni gönderilebilir
            kopekler.Add(yeniKopek);

            kopekler.Add(new Kopek("Luna", "Sheltie", 1, false)); // 2. yöntem: methoda parametre olarak
                                                                  // new'lenmiş bir obje gönderilebilir

            Yazdir("4)", kopekler);



            // AddRange Methodu Örnek 1
            List<int> yeniSayilar = new List<int>() // int[] yeniSayilar = new int[] olarak da array kullanılabilir
            {
                8,
                9
            };

            sayilar.AddRange(yeniSayilar); // 1. yöntem: methoda parametre olarak daha önceden new'lenmiş
                                           // bir koleksiyonun referans değişkeni gönderilebilir

            Yazdir("5)", sayilar);



            // AddRange Methodu Örnek 2
            kopekler.AddRange(new List<Kopek>() // 2. yöntem: methoda parametre olarak new'lenmiş bir koleksiyon gönderilebilir
            {
                new Kopek("Leo Jr.", "Sheltie", 1, true),
                new Kopek("Lassie", "Rough Collie", 3, false)
            });

            Yazdir("6)", kopekler);
            #endregion



            #region IEnumerable, ICollection ve IList Tip Örnekleri
            // List class'ı IEnumerable, ICollection ve IList interface'lerini implemente ettiğinden
            // IEnumerable, ICollection veya IList tipinde bir referans değişkeni üzerinden
            // Polymorphism'den faydalanılarak List tipinde bir obje initialize edilebilir (oluşturulabilir).
            // IEnumerable Örneği
            IEnumerable<string> oyuncuKoleksiyonu = new List<string>()
            {
                "Şener Şen", "Kemal Sunal", "Adile Naşit"
            };

            // İhtiyaç halinde IEnumerable, ICollection veya IList tipindeki bir referans değişkeni üzerinden
            // ToList methodu çağrılarak koleksiyon List tipine dönüştürülebilir.
            // IEnumerable, ICollection, IList veya List tipindeki bir referans değişkeni üzerinden
            // ToArray methodu ile de dizi dönüşümü gerçekleştirilebilir.
            oyuncular = oyuncuKoleksiyonu.ToList();

            Yazdir("7)", oyuncular);



            // ICollection Örneği
            ICollection<Kopek> kopekKoleksiyonu = new List<Kopek>()
            {
                new Kopek("Max", "Border Collie", 5, true),
                new Kopek("Snoopy", "Beagle", 7, true)
            };

            List<Kopek> kopekListesi = kopekKoleksiyonu.ToList();

            Yazdir("8)", kopekListesi, "Köpek Listesi");



            // Bir List objesinin elemanları başka bir listeye ToList methodu çağrılarak kopyalanabilir.
            List<Kopek> kopeklerKopya = kopekler.ToList();

            Yazdir("9)", kopeklerKopya, "Kopyalanmış Köpekler");



            // IList Örneği
            IList<int> sayiKoleksiyonu = new List<int>()
            {
                11, 22, 33, 44, 55
            };

            List<int> sayiListesi = sayiKoleksiyonu.ToList();

            Yazdir("10)", sayiListesi, "Sayı Listesi");
            #endregion



            #region Sort, Sum, Average, Minimum ve Maximum Method Örnekleri
            // Bir koleksiyonda Sort methodu kullanılarak primitive veri tipleri üzerinden (örneğin int, string, double, vb.)
            // artan sıralama yapılabilir.
            sayilar.Sort();

            Yazdir("11)", sayilar, "Sıralanmış Sayılar");



            // Sum methodu ile sayısal primitive tipte elemanlara sahip bir koleksiyonun elemanları toplanabilir.
            Console.WriteLine("12) Sayılar Koleksiyonu Elemanları Toplamı: " + sayilar.Sum());



            // Average methodu ile sayısal primitive tipte elemanlara sahip bir koleksiyonun elemanlarının ortalaması alınabilir.
            Console.WriteLine("13) Sayılar Koleksiyonu Elemanlarının Ortalaması: " + sayilar.Average());



            // Minimum ve Maximum methodları ile primitive tipte elemanlara sahip bir koleksiyonun
            // sırasıyla minimum ve maksimum elemanı dönülebilir.
            Console.WriteLine("14) Sayılar Koleksiyonu Minimum Elemanı: " + sayilar.Min());

            Console.WriteLine("15) Oyuncular Koleksiyonu Maksimum Elemanı: " + oyuncular.Max());
            #endregion



            #region IndexOf, LastIndexOf ve Contains Method Örnekleri
            // IndexOf methodu eğer parametre olarak gönderilen elemanı koleksiyonun ilk elemanından aramaya başlayıp
            // bulursa ilk bulunan elemanın index'ini, bulamazsa -1 döner. Büyük küçük harf duyarlıdır (Case sensitive).
            Console.WriteLine("\n16) Kemal Sunal oyuncusunun index'i: " + oyuncular.IndexOf("Kemal Sunal")); // IndexOf 1 döner

            Console.WriteLine("17) adile naşit oyuncusunun index'i: " + oyuncular.IndexOf("adile naşit")); // IndexOf -1 döner

            Console.WriteLine("18) Tom Cruise oyuncusunun index'i: " + oyuncular.IndexOf("Tom Cruise")); // IndexOf -1 döner

            Console.WriteLine("\n19) 5 sayısının index'i: " + sayilar.IndexOf(5)); // IndexOf 4 döner



            // LastIndexOf methodu eğer parametre olarak gönderilen elemanı koleksiyonun ilk elemanından aramaya başlayıp
            // bulursa son bulunan elemanın index'ini, bulamazsa -1 döner. Büyük küçük harf duyarlıdır.
            Console.WriteLine("20) 5 sayısının son index'i: " + sayilar.LastIndexOf(5)); // LastIndexOf 5 döner



            // Contains methodu eğer parametre olarak gönderilen elemanı koleksiyon içerisinde bulursa true,
            // bulamazsa false döner. Büyük küçük harf duyarlıdır.
            if (oyuncular.Contains("Şener Şen")) // Contains true döner
                Console.WriteLine("\n21) Şener Şen oyuncusu bulundu.");
            else
                Console.WriteLine("\n21) Şener Şen oyuncusu bulunamadı.");

            Console.WriteLine("22) " + (sayilar.Contains(-1) ? "-1 sayısı bulundu." : "-1 sayısı bulunamadı."));



            // IndexOf, LastIndexOf ve Contains methodları eğer parametre olarak new'lenmiş bir obje alırsa
            // listedeki elemanların referansları ile new'lenmiş objenin referansı farklı olduğundan bulamaz.
            if (kopekler.Contains(new Kopek("Leo Jr.", "Sheltie", 1, true))) // Contains false döner
                Console.WriteLine("\n23) Leo Jr. köpeği bulundu.");
            else
                Console.WriteLine("\n23) Leo Jr. köpeği bulunamadı.");



            // Ancak listedeki bir elemanın referansı parametre olarak IndexOf, LastIndexOf veya Contains
            // methodlarına gönderilirse o zaman method Contains için true,
            // IndexOf ve LastIndexOf için elemanın index'ini döner.
            Kopek kopeklerdekiEleman = kopekler[3];

            Console.WriteLine("\n24) Leo Jr. köpeğinin index'i: " + kopekler.IndexOf(kopeklerdekiEleman)); // IndexOf 3 döner
            #endregion



            #region Insert, Remove, RemoveAt ve Clear Method Örnekleri
            // Insert methodu ilk parametre olarak gönderilen index'e ikinci parametre olarak gönderilen elemanı ekler.
            oyuncular.Insert(1, "Münir Özkul"); // oyuncular'ın 1. index'ine Münir Özkul'u ekleyecek

            Yazdir("25)", oyuncular);



            Kopek eklenecekVeCikarilacakKopek = new Kopek("Sharky", "Sharkdog", 2, true);
            kopekler.Insert(0, eklenecekVeCikarilacakKopek); // kopekler'in en başına Sharky adlı köpeği ekleyecek

            Yazdir("26)", kopekler);



            // Remove methodu parametre olarak gönderilen elemanı eğer eleman referans tipse elemanın
            // bulduğu ilk referansı üzerinden, eleman değer tipse elemanın bulduğu ilk değeri üzerinden koleksiyondan çıkarır.
            kopekler.Remove(eklenecekVeCikarilacakKopek);

            Yazdir("27)", kopekler);



            sayilar.Remove(5);

            Yazdir("28)", sayilar);



            // RemoveAt methodu parametre olarak gönderilen index üzerinden elemanı koleksiyondan çıkarır.
            oyuncular.RemoveAt(oyuncular.Count - 1); // oyuncular'ın son elemanını çıkaracak

            Yazdir("29)", oyuncular);



            // Clear methodu bir koleksiyondaki tüm elemanları koleksiyondan çıkarır,
            // dolayısıyla koleksiyonun Count özelliği 0 döner.
            //sayilar.Clear();
            #endregion



            #region First, FirstOrDefault, Last ve LastOrDefault Method Örnekleri
            int ilkSayi, sonSayi;
            string ilkOyuncu, sonOyuncu;
            Kopek ilkKopek, sonKopek;

            // First methodu bir koleksiyondaki ilk elemanı bulursa döner, bulamazsa ki örneğin koleksiyonda eleman olmaması durumunda
            // beklenmedik hata (exception) fırlatır.
            ilkSayi = sayilar.First();
            Console.WriteLine($"\n30) First methodu sonucu ilk sayı: {ilkSayi}");

            // FirstOrDefault methodu bir koleksiyondaki ilk elemanı bulursa döner, bulamazsa varsayılan (default) bir değer döner,
            // koleksiyon elemanlarının tipi sayısal tip ise 0 referans tip ise null döner.
            ilkOyuncu = oyuncular.FirstOrDefault();
            Console.WriteLine($"31) FirstOrDefault methodu sonucu ilk oyuncu: {ilkOyuncu}");

            // Last methodu bir koleksiyondaki son elemanı bulursa döner, bulamazsa ki örneğin koleksiyonda eleman olmaması durumunda
            // beklenmedik hata (exception) fırlatır.
            sonOyuncu = oyuncular.Last();
            Console.WriteLine($"32) Last methodu sonucu son oyuncu: {sonOyuncu}");

            // LastOrDefault methodu bir koleksiyondaki son elemanı bulursa döner, bulamazsa varsayılan (default) bir değer döner,
            // koleksiyon elemanlarının tipi sayısal tip ise 0 referans tip ise null döner.
            sonKopek = kopekler.LastOrDefault();
            Console.WriteLine($"33) LastOrDefault methodu sonucu son köpek:\n{sonKopek}");

            ilkKopek = kopekler.FirstOrDefault();
            Console.WriteLine($"34) FirstOrDefault methodu sonucu ilk köpek:\n{ilkKopek}");
            #endregion

            #endregion



            #region 1) Sayı Tekillik Demo (IEnumerable Tipi ve Distinct Koleksiyon Methodu)
            SayiTekillikDemo sayiTekillikDemo = new SayiTekillikDemo();
            sayiTekillikDemo.Calistir();
            #endregion



            #region 2) İsim Bulma Demo
            IsimBulmaDemo isimBulmaDemo = new IsimBulmaDemo();
            isimBulmaDemo.Calistir();
            #endregion



            #region 3) Organizasyonlar Demo
            OrganizasyonlarDemo organizasyonlarDemo = new OrganizasyonlarDemo();
            organizasyonlarDemo.Calistir();
            #endregion
        }



        #region I) Koleksiyon Method ve Özellikleri Konusunda Konsola Yazdırmak için Overload Edilmiş Methodlar
        static void Yazdir(string ornekNo, List<int> sayilar, string listeAdi = "Sayılar")
        {
            Console.WriteLine($"\n{ornekNo} {listeAdi} Koleksiyonu Elemanları:");
            foreach (int sayi in sayilar)
            {
                Console.WriteLine(sayi);
            }
        }

        static void Yazdir(string ornekNo, List<Kopek> kopekler, string listeAdi = "Köpekler")
        {
            Console.WriteLine($"\n{ornekNo} {listeAdi} Koleksiyonu Elemanları:");
            foreach (var kopek in kopekler)
            {
                Console.WriteLine("\n" + kopek);
            }
        }

        static void Yazdir(string ornekNo, List<string> oyuncular, string listeAdi = "Oyuncular")
        {
            Console.WriteLine($"\n{ornekNo} {listeAdi} Koleksiyonu Elemanları:");
            foreach (var oyuncu in oyuncular)
            {
                Console.WriteLine(oyuncu);
            }
        }
        #endregion
    }
}