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

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

Merhaba,

Önceki yazılarımdan C#’ta IComparable Interface’i İle Nesneleri Sıralama başlıklı yazımda nesnelerin sıralanabilmesi için IComparable interface’i ile bir sıralama algoritması belirlemiştik. Eğer ilgili yazıyı okuduysanız IComparable interface’i ile kendi oluşturduğumuz sınıflar üzerinde sıralama algoritması oluşturabileceğimizi görmüşsünüz demektir. Ya da bir başka deyişle IComparable interface’i ile kaynak koduna erişebildiğimiz sınıflar üzerinde sıralama algoritmaları inşa edebilmekteyiz.

Peki…

Eğer ki, kendimizin oluşturmadığı ya da kaynak koduna erişemediğimiz sınıflar üzerinde bir sıralama algoritması belirlemek istersek bunu IComparable interface’i ile gerçekleştiremeyeceğimiz aşikardır. İşte böyle bir durumda IComparer interface’ini devreye sokabilir, istediğiniz tipte nesneler üzerinde istediğiniz sıralama algoritması oluşturabilirsiniz.

    class At
    {
        public string Adi { get; set; }
        public decimal YarisTamamlamaSuresi { get; set; }
    }

Şimdi yukarıdaki sınıfı ele alalım. Varsayalım ki, bu sınıfın kaynak kodları elimizde değil. Eee, sınıf içerisinde bir sıralama algoritması da belirlenmediğine göre bu sınıf tipinden bir koleksiyonu sıralamaya çalıştığımızda belliki hatayla karşılaşacağız…

    class Program
    {
        static void Main(string[] args)
        {
            List<At> Atlar = new List<At>()
            {
                new At { Adi = "Gülazer", YarisTamamlamaSuresi = 30 },
                new At { Adi = "Rıfkı", YarisTamamlamaSuresi = 32 },
                new At { Adi = "Şuayip", YarisTamamlamaSuresi = 13 },
                new At { Adi = "Faruk", YarisTamamlamaSuresi = 31 },
                new At { Adi = "Nazlı", YarisTamamlamaSuresi = 11 },
                new At { Adi = "Yonca", YarisTamamlamaSuresi = 23 }
            };

            Atlar.ForEach(a => Console.WriteLine($"{a.Adi} {a.YarisTamamlamaSuresi}"));
            Atlar.Sort();
            Console.WriteLine("*****************");
            Atlar.ForEach(a => Console.WriteLine($"{a.Adi} {a.YarisTamamlamaSuresi}"));
            Console.Read();
        }
    }

Şeklinde bir çalışma sergilersek beklenildiği gibi aşağıdaki hatayla karşılaşılmaktadır.
C#'ta IComparer Interface'i İle Nesneleri Sıralama

Şimdi gelin IComparer interface’i ile “YarisTamamlamaSuresi” propertysine göre sıralama algoritması oluşturalım.

Bu işlemi yapabilmek için “At” sınıfına özel bir Comparer sınıfı oluşturacağız ve IComparer Interface’ini bu sınıfa uygulayacağız.

    class AtComparer : IComparer<At>
    {
        public int Compare(At x, At y)
        {
            return x.YarisTamamlamaSuresi.CompareTo(y.YarisTamamlamaSuresi);
        }
    }

Evet, gördüğünüz gibi “AtComparer” sınıfı, IComparer Interface’ini uyguladığı zaman “Compare” isimli metodumuz gelmektedir. Bu metod, iki “At” tipinden nesneyi kıyaslayarak geriye sonuç dönecektir. Tıpkı IComparable Interface’ini uyguladığımızda gelen “CompareTo” metodunda olduğu gibi “Compare” metodunda da dönen sonuç;

  • Negatif bir değerse, x nesnesi y nesnesinden küçük
  • Sıfıra eşitse, x nesnesi y nesnesine eşit
  • Sıfırdan büyük ise, x nesnesi y nesnesinden büyük

olarak değerlendirilmektedir.

Sıralama algoritma işlemini yürütecek “AtComparer” sınıfımızı oluşturduktan sonra sıra ilk verdiğimiz kod bloğunu güncellemeye gelmektedir.

    class Program
    {
        static void Main(string[] args)
        {
            List<At> Atlar = new List<At>()
            {
                new At { Adi = "Gülazer", YarisTamamlamaSuresi = 30 },
                new At { Adi = "Rıfkı", YarisTamamlamaSuresi = 32 },
                new At { Adi = "Şuayip", YarisTamamlamaSuresi = 13 },
                new At { Adi = "Faruk", YarisTamamlamaSuresi = 31 },
                new At { Adi = "Nazlı", YarisTamamlamaSuresi = 11 },
                new At { Adi = "Yonca", YarisTamamlamaSuresi = 23 }
            };

            Atlar.ForEach(a => Console.WriteLine($"{a.Adi} {a.YarisTamamlamaSuresi}"));
            Atlar.Sort(new AtComparer());
            Console.WriteLine("*****************");
            Atlar.ForEach(a => Console.WriteLine($"{a.Adi} {a.YarisTamamlamaSuresi}"));
            Console.Read();
        }
    }

Dikkat ederseniz 16. satırdaki “Atlar.Sort” metodu güncellenerek sıralama esnasında uygulayacağı algoritmayı belirtmekteyiz.

Son adım olarak projemizi derleyip çalıştırdığımızda aşağıdaki gibi çıktı almaktayız.
C#'ta IComparer Interface'i İle Nesneleri Sıralama

Gördüğünüz gibi belirlediğimiz algoritmaya göre Source Code’u gizli olan sınıflarda sıralama işlemini gerçekleştirmiş olduk.

Faydalanmanız dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir