Clear        


                
                    namespace _03_Encapsulation.Demos.Dizi
{
    // summary class'lar, alanlar, özellikler ve methodlar üzerinde kullanılabilir. Amacı class'ın kullanıldığı yerlerde class, alan, özellik veya method adı yazıldığında
    // bilgi amaçlı yazılan açıklamayı görebilmektir.
    /// <summary>
    /// Sayısal Tek Boyutlu Dizi'lerin en çok kullanılan özellik ve methodlarını içeren ve dizinin bu özellik ve methodlar üzerinden yönetilebildiği class.
    /// </summary>
    public class TekBoyutluDizi
    {
        #region Dizi Property'si Oluşturma 1. Yöntem:
        /*
        double[] _dizi; // field (alan)

        /// <summary>
        /// Tek Boyutlu Dizi özelliği.
        /// </summary>
        public double[] Dizi // dizi property'si
        {
            get => _dizi; // _dizi alanını dön, Dizi özelliği üzerinden class içerisindeki _dizi alanının refere ettiği diziye ulaşılabilir
            set => _dizi = value; // değeri _dizi alanına ata
        }
        */
        #endregion

        #region Dizi Property'si Oluşturma 2. Yöntem: Genel Kullanım
        public double[] Dizi { get; set; }
        #endregion



        /// <summary>
        /// Tek Boyutlu Dizi'nin eleman sayısı özelliği.
        /// </summary>
        public int Boyut => Dizi.Length; // Boyut readonly property'si (obje üzerinden set edilemez)

        /// <summary>
        /// Tek Boyutlu Dizi elemanlarını parametre olarak gönderilen ve default (varsayılan) olarak "\n" (new line) atanmış ayraca göre ekrana yazdırır.
        /// </summary>
        /// <param name="ayrac"></param>
        public void Goster(string ayrac = "\n")
        {
            Console.WriteLine("Dizi elemanları:");
            foreach (double eleman in Dizi) // dizideki her bir elemanı döngüde turla (iterate et)
            {
                Console.Write($"{eleman}{ayrac}"); // ve konsola ayrac parametresi ile birlikte yazdır
            }
        }

        /// <summary>
        /// Tek Boyutlu Dizi elemanlarının toplamını dönen method.
        /// </summary>
        /// <returns>double</returns>
        public double Topla() // Topla behavior'ı (davranış)
        {
            // 1. yöntem:
            //double toplam = 0; // methoddan dönecek toplam local variable (değişken), dizinin içerisinde eleman olmadığında aşağıdaki foreach döngüsüne girmeme ihtimali olduğu için
            //                   // ilk değer olarak 0 ataması yapıyoruz.
            //foreach (double eleman in Dizi) // dizideki her bir eleman için
            //{
            //    toplam += eleman; // dizi elemanlarını toplam'a ekle
            //}
            //return toplam; // toplam sonucunu dön

            // 2. yöntem:
            return Dizi.Sum(); // Sum: koleksiyon üzerinden sayısal elemanları toplama methodu
        }

        /// <summary>
        /// Tek Boyutlu Dizi elemanlarının ortlamasını dönen method.
        /// </summary>
        /// <returns>double</returns>
        public double OrtalamaHesapla() // OrtalamaHesapla behavior'ı (davranış)
        {
            // 1. yöntem:
            //double ortalama; // toplam ve dizi eleman sayısı üzerinden hesaplanacak ve methoddan dönülecek ortalama local variable'ı (değişken)
            //double toplam = Topla(); // Topla methodu sonucunun set edildiği local variable (değişken)
            //ortalama = toplam / Boyut; // ortalamayı toplam ve Boyut üzerinden hesapla
            //return ortalama; // ortalama sonucunu methoddan dön

            // 2. yöntem:
            return Dizi.Average(); // Average: koleksiyon üzerinden sayısal elemanların ortalamasını dönen method
        }

        /// <summary>
        /// Tek Boyutlu Dizi elemanlarından en küçüğünü dönen method.
        /// </summary>
        /// <returns>double</returns>
        public double MinimumuGetir() // MinimumuGetir behavior'ı (davranış)
        {
            // 1. yöntem:
            //double minimum = Dizi[0]; // dizinin ilk elemanını minimum olarak ata
            //for (int i = 1; i < Boyut; i++) // dizinin 1. index'ten başlayarak tüm elemanlarını turla (iteration)
            //{
            //    if (Dizi[i] < minimum) // eğer dizinin i. index'teki elemanı minimum değişkeninin değerinden küçükse
            //        minimum = Dizi[i]; // minimum değişkeninin değerini i. index'teki elemanın değeri olarak güncelle
            //}
            //return minimum; // minimum sonucunu methoddan dön

            // 2. yöntem:
            return Dizi.Min(); // Min: koleksiyondaki minimum sayısal elemanı dönen method
        }

        /// <summary>
        /// Tek Boyutlu Dizi elemanlarından en büyüğünü dönen method.
        /// </summary>
        /// <returns>double</returns>
        public double MaksimumuGetir() // MaksimumuGetir behavior'ı (davranış)
        {
            // 1. yöntem:
            //double maksimum = Dizi[0]; // dizinin ilk elemanını maksimum olarak ata
            //for (int i = 1; i < Boyut; i++) // dizinin 1. index'ten başlayarak tüm elemanlarını turla (iteration)
            //{
            //    if (Dizi[i] > maksimum) // eğer dizinin i. index'teki elemanı maksimum değişkeninin değerinden büyükse
            //        maksimum = Dizi[i]; // maksimum değişkeninin değerini i. index'teki elemanın değeri olarak güncelle
            //}
            //return maksimum; // maksimum sonucunu methoddan dön

            // 2. yöntem:
            return Dizi.Max(); // Max: koleksiyondaki maksimum sayısal elemanı dönen method
        }
    }
}