Icomparable Implementasyonu

IComparable arayüzü, bir sınıfın nesnelerinin sıralanabilmesi için karşılaştırma mantığını tanımlamasına olanak tanır. Bu arayüz, sıralama algoritmalarında kullanılmak üzere nesneleri karşılaştırmak için gereklidir.

Aşağıda, IComparable arayüzünün nasıl uygulanabileceğini gösteren bir örnek bulunuyor:

IComparable Implementasyonu

Örneğin, bir Student sınıfınız olduğunu varsayalım. Bu sınıftaki öğrencileri Age (yaş) özelliğine göre sıralamak isteyebilirsiniz. Bu durumda IComparable arayüzünü şu şekilde uygulayabilirsiniz:

namespace IcomparableImplementasyonu
{
    public class Student : IComparable<Student>
    {
        public string Name { get; set; }
        public int Age { get; set; }

        // IComparable arayüzünün CompareTo metodunu uyguluyoruz.
        public int CompareTo(Student other)
        {
            #region Yontem1
            // Yöntem 1: CompareTo metodu kullanarak karşılaştırma
            // 'other' nesnesi null ise, bu nesnenin (this) daha büyük olduğunu belirten 1 değeri döndürülür.
            // Eğer 'other' null değilse, this.Age ve other.Age karşılaştırılır.
            // this.Age < other.Age ise negatif bir değer döner.
            // this.Age > other.Age ise pozitif bir değer döner.
            // Eğer yaşlar eşitse 0 döner, bu da iki nesnenin eşit olduğunu belirtir.

            if (other == null) return 1;
            return this.Age.CompareTo(other.Age);
            #endregion

            #region Yontem2
            // Yöntem 2: Manuel karşılaştırma
            // 'this.Age' ile 'other.Age' karşılaştırılır.
            // Eğer this.Age < other.Age ise, -1 döndürülür. Bu, bu nesnenin (this) diğer nesneden (other) daha küçük olduğunu belirtir.
            // Eğer this.Age > other.Age ise, 1 döndürülür. Bu, bu nesnenin (this) diğer nesneden (other) daha büyük olduğunu belirtir.
            // Eğer yaşlar eşitse 0 döner, bu da iki nesnenin eşit olduğunu belirtir.
            if (this.Age < other.Age)
                return -1;
            if (this.Age > other.Age)
                return 1;
            return 0;
            #endregion
        }

        public override string ToString()
        {
            return $"Name: {Name}, Age: {Age}";
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            // Öğrenciler listesi oluşturuyoruz.
            Student[] students = {
            new Student { Name = "Ahmet", Age = 21 },
            new Student { Name = "Zeynep", Age = 19 },
            new Student { Name = "Murat", Age = 23 },
            new Student { Name = "Murat", Age = 21 },
        };

            // Öğrencileri yaşa göre sıralıyoruz.
            Array.Sort(students);

            // Sıralanmış listeyi ekrana yazdırıyoruz.
            foreach (var student in students)
            {
                Console.WriteLine(student);
            }
        }
    }
}

Açıklamalar:

IComparable Interface: IComparable<T> arayüzü, CompareTo metodunu içerir. Bu metod, bir nesneyi başka bir nesneyle karşılaştırır.

CompareTo Metodu: CompareTo metodunda, mevcut nesne (this) ile diğer nesne (other) karşılaştırılır.

  • Yöntem 1:
    • CompareTo metodu, karşılaştırmayı gerçekleştirmek için int veri türüne özgü yerleşik CompareTo metodunu kullanır. Bu yöntem daha kısadır ve dilin sunduğu yerleşik karşılaştırma işlevinden faydalanır.
    • Eğer other nesnesi null ise, bu nesnenin (this) daha büyük olduğunu belirlemek için 1 döndürülür.
  • Yöntem 2:
    • Bu yöntemde, karşılaştırma işlemi manuel olarak gerçekleştirilir. Önce iki Age değeri arasında bir karşılaştırma yapılır.
    • Eğer this.Age değeri other.Age‘den küçükse, -1 döndürülür; büyükse 1 döndürülür. Eşitse 0 döndürülür.

Sort: Array.Sort(students) ifadesi, Student nesnelerini yaşa göre sıralar.

Her iki yöntem de işlevsel olarak aynı sonucu verir, ancak Yöntem 1 daha kısa ve CompareTo metodunu kullanarak daha yaygın bir yaklaşımla karşılaştırmayı gerçekleştirir.

Bu şekilde IComparable arayüzü uygulanarak Student nesneleri yaşlarına göre kolayca sıralanabilir.