Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C#’ta IComparable Interface’i İle Nesneleri Sıralama

Merhaba,

Bu içeriğimizde, kendisini uygulayan sınıfta kendi tipindeki nesnelere karşı nasıl bir karşılaştırma yapılacağını belirlemek için kullanılan IComparable Interface’ine değineceğiz.

IComparable Interface’i, miras alan sınıfa CompareTo metodunu uygulatmakta ve bu metot aracılığıyla karşılaştırmayı sağlamaktadır.

Biliyoruz ki, Array sınıfının static Sort metodu ile elimizdeki değer tipli verileri yani basit veri tiplerini sıralabiliyoruz. Lakin referans tipli verileri yani nesneleri sıralamaya çalışırken ilgili fonksiyonu kullanamıyoruz. Bunun sebebi, nesnelerin hangi özelliğine göre sıralama işlemi yapacağını Array.Sort metodunun bilememesidir.

Şimdi bu bahsettiklerimizi aşağıda teknik olarak ele alalım…

    class Program
    {
        static void Main(string[] args)
        {
            int[] Sayilar =  { 3, 325, 34, 53, 46, 37, 54, 53, 543, 574574523, 564574, 56 };
            foreach (var item in Sayilar)
            {
                Console.Write(item + ", ");
            }
            Console.WriteLine("");
            Array.Sort(Sayilar);
            foreach (var item in Sayilar)
            {
                Console.Write(item + ", ");
            }

            Console.Read();
        }
    }

C#'ta IComparable Interface'i İle Nesneleri Sıralama
Gördüğünüz gibi, basit verilerden oluşan veri kümesinde Array.Sort ile net bir şekilde sıralama işlemimizi gerçekleştirebiliyoruz.

    class Program
    {
        static void Main(string[] args)
        {
            Ogrenci[] Ogrenciler =
                {
                new Ogrenci("Hilmi", "Celayir", 39, true),
                new Ogrenci("Ayşe", "Yılmaz", 24, false),
                new Ogrenci("Ali", "Çukurambar", 32, true),
                new Ogrenci("Veli", "Pursaklar", 13, true),
                new Ogrenci("Mustafa", "Ceceli", 23, true)
                };

            foreach (var item in Ogrenciler)
            {
                Console.Write(item.Adi + ", ");
            }
            Console.WriteLine("");
            Array.Sort(Ogrenciler);
            foreach (var item in Ogrenciler)
            {
                Console.Write(item.Adi + ", ");
            }

            Console.Read();
        }
    }

C#'ta IComparable Interface'i İle Nesneleri Sıralama
Mevzu bahis nesneleri sıralamaya gelince yukarıda gördüğünüz hatayı almaktayız.

An unhandled exception of type ‘System.InvalidOperationException’ occurred in mscorlib.dll

Additional information: Dizideki iki öğe karşılaştırılamadı.

Bu hatayı almamızın sebebi, yukarıdaki satırlarda bahsettiğim gibi ilgili nesnenin hangi özelliğine göre sıralama yapılacağının bilinememesinden kaynaklanmaktadır.

Şimdi ilgili Ogrenci sınıfımıza IComparable Interface’ini uygulayarak sıralama kuralını belirleyelim.

    class Ogrenci : IComparable
    {
        public string Adi { get; set; }
        public string SoyAdi { get; set; }
        public int Yas { get; set; }
        public bool Cinsiyet { get; set; }
        public Ogrenci(string Adi, string SoyAdi, int Yas, bool Cinsiyet)
        {
            this.Adi = Adi;
            this.SoyAdi = SoyAdi;
            this.Yas = Yas;
            this.Cinsiyet = Cinsiyet;
        }

        public int CompareTo(object obj)
        {
            Ogrenci DigerOgrenci = obj as Ogrenci;
            int Sonuc = 0;
            if (DigerOgrenci != null)
            {
                if (this.Yas > DigerOgrenci.Yas)
                    Sonuc = 1;
                else if (this.Yas == DigerOgrenci.Yas)
                    Sonuc = 0;
                else
                    Sonuc = -1;
            }
            return Sonuc;
        }
    }

Yukarıdaki Ogrenci sınıfını incelerseniz eğer CompareTo metodu içerisinde diğer nesneleri temsil eden object tipinde bir “obj” isimli parametre gelmektedir. Yapılan kontrol neticesinde o anki nesneyle, diğer nesneler arasında belirli özelliğe göre karşılaştırma yapılmakta ve karşılaştırmanın sonucu geriye int tipinde bir değer olarak döndürülmektedir.

Burada bilmeniz gereken sıralama algoritmasının .NET açısından nasıl değerlendirildiğidir. Eğer dönen sonuç;

  • Negatif bir değerse, bu nesne diğer nesneden küçük
  • Sıfıra eşitse, bu nesne ile diğer nesne eşit
  • Sıfırdan büyük ise, bu nesne diğer nesneden büyük

olarak değerlendirilmektedir.

IComparable Interface’ini uyguladıktan sonra aşağıdaki gibi sıkıntısız bir şekilde Array.Sort metoduyla sıralama gerçekleştirebiliriz.

    class Program
    {
        static void Main(string[] args)
        {
            Ogrenci[] Ogrenciler =
                {
                new Ogrenci("Hilmi", "Celayir", 39, true),
                new Ogrenci("Ayşe", "Yılmaz", 24, false),
                new Ogrenci("Ali", "Çukurambar", 32, true),
                new Ogrenci("Veli", "Pursaklar", 13, true),
                new Ogrenci("Mustafa", "Ceceli", 23, true)
                };

            foreach (var item in Ogrenciler)
            {
                Console.Write(item.Adi + ", ");
            }
            Console.WriteLine("");
            Array.Sort(Ogrenciler);
            foreach (var item in Ogrenciler)
            {
                Console.Write(item.Adi + ", ");
            }

            Console.Read();
        }
    }

Nihayetinde yukarı satırlarda hata veren bu kod bloğu IComparable Interface’ini implement ettikten sonra hatasız çalışacaktır. Array.Sort metodu otomatik olarak CompareTo metodunu görecek ve ilgili metod üzerinde sıralama algoritması neticesinde çıktı verecektir.
C#'ta IComparable Interface'i İle Nesneleri Sıralama

Ek olarak .NET içerisinde ön tanımlı çoğu tip IComparable Interface’ini uyguladıkları için CompareTo metodunu aşağıdaki gibide kullanabiliriz.

        public int CompareTo(object obj)
        {
            Ogrenci DigerOgrenci = obj as Ogrenci;
            int Sonuc = 0;
            if (DigerOgrenci != null)
            {
                Sonuc = Yas.CompareTo(DigerOgrenci.Yas);
            }
            return Sonuc;
        }

Nihayetinde yukarıdaki manevrada aynı sonucu verecektir.

Okuduğunuz için teşekkür ederim…

Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

6 Cevaplar

  1. Adil dedi ki:

    Salam. Sinif öz-özünü necə implement edir ? (İlk sətir)

    • Gençay dedi ki:

      Anlayamadım? Sorunuzu biraz daha açar mısınız?

      • Adil dedi ki:

        Sınıf kendi kendini nasıl implement ediyor? (İlk satır) class A : A boyle yapinca hata aliyorum. Kendisini uygulayan sinif derken neyi kast ediyorsunuz?

        • Gençay dedi ki:

          Hmm…

          Siz anlaşılan giriş cümlesindeki şu;
          Bu içeriğimizde, kendisini uygulayan sınıfta kendi tipindeki nesnelere karşı nasıl bir karşılaştırma yapılacağını belirlemek için kullanılan IComparable Interface’ine değineceğiz….
          cümleye takıldınız 🙂

          Burada “…kendisini uygulayan sınıfta…” cümlesinden kastım “…IComparable Interface’ini uygulayan sınıfta…” demek istedim 🙂

          Yoksa tabi ki de bir sınıf kendisinden türeyemez…
          Sevgiler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.