Clear        


                
                    namespace _18_CollectionMethods.Demos._1_SayiTekillik
{
    public class SayiTekillikDemo
    {
        #region I) Sayı Tekillik Demo'yu Çalıştıran Method
        public void Calistir()
        {
            Console.WriteLine("\n*** Sayı Tekillik Demo ***");

            // Tekrarlamayan Sayılar Demo (Farklı test senaryoları)
            List<int> tekrarlamayanSayilar1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            Console.Write("Sayılar: ");
            Yazdir(tekrarlamayanSayilar1);
            TekrarlayanSayilariYazdir(tekrarlamayanSayilar1);

            List<int> tekrarlamayanSayilar2 = new List<int>() { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
            Console.Write("Sayılar: ");
            Yazdir(tekrarlamayanSayilar2);
            TekrarlayanSayilariYazdir(tekrarlamayanSayilar2);

            List<int> tekrarlamayanSayilar3 = new List<int>() { 3, 1, 5, 2, 4, 9, 6, 8, 7 };
            Console.Write("Sayılar: ");
            Yazdir(tekrarlamayanSayilar3);
            TekrarlayanSayilariYazdir(tekrarlamayanSayilar3);



            // Tekrarlayan Sayılar Demo (Farklı test senaryoları)
            List<int> tekrarlayanSayilar1 = new List<int>() { 1, 2, 2, 3, 3, 3, 4, 4, 5 };
            Console.Write("\nSayılar: ");
            Yazdir(tekrarlayanSayilar1);
            TekrarlayanSayilariYazdir(tekrarlayanSayilar1);

            List<int> tekrarlayanSayilar2 = new List<int>() { 5, 4, 4, 3, 3, 3, 2, 2, 1 };
            Console.Write("Sayılar: ");
            Yazdir(tekrarlayanSayilar2);
            TekrarlayanSayilariYazdir(tekrarlayanSayilar2);

            List<int> tekrarlayanSayilar3 = new List<int>() { 3, 1, 5, 2, 2, 4, 3, 4, 3 };
            Console.Write("Sayılar: ");
            Yazdir(tekrarlayanSayilar3);
            TekrarlayanSayilariYazdir(tekrarlayanSayilar3);
        }
        #endregion



        #region II) Sayı Tekillik Demo Davranışları
        /// <summary>
        /// Parametre olarak gönderilen sayılar listesi üzerinden tekrarlayan sayıları konsola yazdırır.
        /// </summary>
        /// <param name="sayilar"></param>
        private void TekrarlayanSayilariYazdir(List<int> sayilar)
        {
            // sayilar koleksiyonu üzerinden tekrarlayan sayıları ekleyeceğimiz koleksiyon
            List<int> tekrarlayanSayilar = new List<int>();

            // tekrarlayan sayı adedi için kullanacağımız local değişken
            int tekrarlayanSayiAdedi;

            for (int i = 0; i < sayilar.Count; i++) // dışarıdaki döngüde sayıları ilk elemanından itibaren turlamaya başlıyoruz
            {
                tekrarlayanSayiAdedi = 0; // sayılar koleksiyonunun her bir elemanı için tekrarlayan sayı adedini tekrar 0 olarak atıyoruz

                for (int j = i + 1; j < sayilar.Count; j++) // içerideki döngüde dışarıdaki döngü turundaki her bir eleman için
                                                            // bir sonraki eleman üzerinden turlamaya başlıyoruz
                {
                    if (sayilar[i] == sayilar[j]) // eğer eşitlik varsa tekrarlıyor demektir, tekrarlayan sayı adedini 1 arttırıyoruz
                    {
                        tekrarlayanSayiAdedi++;
                    }
                }
                if (tekrarlayanSayiAdedi > 0) // eğer tekrarlayan sayı adedi 0'dan büyükse tekrarlayan sayılar koleksiyonuna ekliyoruz
                {
                    tekrarlayanSayilar.Add(sayilar[i]);
                }
            }

            // yukarıdaki döngüler bittikten sonra elimizde çoklayan bir şekilde tekrarlayan sayı koleksiyonu olacağından
            // Distinct methodu ile çoklayanları teke düşürüp methodun dönüş tipi olan bir IEnumerable<int> tipinde değişkene atıyoruz,
            // IEnumerable bir interface'dir ve koleksiyon tipidir, dolayısıyla bazı koleksiyon method ve özellikleri kullanılabilir
            IEnumerable<int> tekilTekrarlayanSayilar = tekrarlayanSayilar.Distinct();

            int tekilTekrarlayanAdet = tekilTekrarlayanSayilar.Count(); // IEnumerable tipte bir koleksiyonun eleman sayısı
                                                                        // Count() methodu ile alınır

            if (tekilTekrarlayanAdet == 0)
            {
                Console.WriteLine("Sayılar içerisinde tekrarlayan sayı bulunmamaktadır.");
            }
            else
            {
                Console.Write("Sayılar içerisinde " + tekilTekrarlayanAdet + " adet tekrarlayan sayı bulunmaktadır: ");
                Yazdir(tekilTekrarlayanSayilar.ToList()); // IEnumerable tipte bir koleksiyon üzerinden ToList methodu
                                                          // ile List tipinde bir koleksiyon oluşturulabilir
            }
        }



        /// <summary>
        /// Parametre olarak gönderilen sayı listesinin elemanlarını virgül ile ayırarak konsola yazdırır.
        /// </summary>
        /// <param name="sayilar"></param>
        private void Yazdir(List<int> sayilar)
        {
            string sonuc = "";
            foreach (int sayi in sayilar)
            {
                sonuc += sayi + ", ";
            }
            sonuc = sonuc.Trim(',', ' ');
            Console.WriteLine(sonuc);
        }
        #endregion
    }
}