Merhabalar,
IComparable interfacenin nesnelere implemantasyonu hakkında bilgiler vereceğim.
Veri kümelerini saklamak için kullandığımız dizi ya da koleksiyon içerisinde yer alan sayısal değerleri sıralayarak başlayalım.
Öncelikle Visual Studio içerisinde bir console uygulaması oluşturalım.
Liste içerisindeki elemanları sıralamak için aşağıdaki kodlar kullanılır.
Görmüş olduğunuz gibi eğer sıralamak istediğimiz değer int ise direkt sort( ) metodunu kullanarak sıralama yapabiliriz.
Eğer nesne türünde verilerden oluşan bir yapıyı sıralamamız gerekirse ne yapmalıyız?
Öncelikle projemize bir ogrenci classı tanımlayıp fieldlarını no,ad,soyad olarak ayarlayalım. ToString ( )metodunu ezelim çağırıldığında ekrana "no-ad soyad " yapısına uyacak şekilde bilgileri yazdıracak şekilde set edelim.
Program classı tarafında ogrenci classını kullanarak çalışacak bir list tanımlayaalım ve içerisine 3 tane öğrenci nesnesi ekleyelim.
Bu şekilde yazıp çalıştırmamız durumunda ogrenciler.sort() metodunda aşağıdaki gibi bir hata verecektir.
Görmüş olduğunuz gibi eğer sıralamak istediğimiz nesne ise IComparable interface'ni implement etmemiz gerekir. Şimdi int türünde böyle birşey yapmadık diye sorduğunuzu duyar gibiyim . int türünde bunu yapmadık çünkü eğer int türünün tanımlandığı yere gidersek IComparable interface'ni default implement ettiğini görebilirsiniz. (int yazısı üzerindeyken F12 yazıp gidebiliriz.)
Ogrenci classına IComparable interfaceni implement edelim. Bu durumda almış olduğumuz hata CompareTo metodunun da eklenmesi ve özelleştirilmesidir. IComparable CompareTo( ) metoduna bakarak çalışacaktır. Hatayı çözmek için classın üzerindeyken ctrl ile birlikte . basılıp gelen listeden de implement interface seçeneği seçilir.
Ögrenci classının IComparable nesnesinden gelen compareto metodunu override etmesini sağlamalıyız. Sort sıralama işlemini gerçekleştirirken nesnenin içerisinde yer alan CompareTo() metoduna bakarak bu işlemi yapacaktır.
CompareTo( ) metodu her seferinde parametre olarak gelen değeri o anki nesne ile karşılaştıracaktır. Eğer mevcut nesnenin no değeri parametre olarak gelenin no değerinden büyükse return 1,
yani mevcut nesnenin değeri karşılaştırılan nesneden büyükse 1 aksi takdirde -1 dönmesini istiyoruz.
Parametre olarak gelen object değerini ogrenci nesnesine alıp karşılaştırma işlemini aşağıdaki gibi yapalım.
public int CompareTo(object obj)
{
ogrenci ogrencitocompare = (ogrenci)obj;
if (this.no > ogrencitocompare.no)
return 1;
else
return -1;
}
Sonrasında çalıştırırsak ogrenci nesnelerini no değerine göre sıralamış oluruz.
Classların son halleri aşağıdaki gibidir.
Ogrenci Class Kodları
----------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomComparing
{
class ogrenci:IComparable
{
public int no { get; set; }
public string ad { get; set; }
public string soyad { get; set; }
public override string ToString()
{
return string.Format("{0}-{1} {2}",this.no,this.ad,this.soyad);
}
public int CompareTo(object obj)
{
ogrenci ogrencitocompare = (ogrenci)obj;
if (this.no > ogrencitocompare.no)
return 1;
else
return -1;
}
}
}
Program Class Kodları
---------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomComparing
{
class Program
{
static void Main(string[] args)
{
//List<int> sayilar = new List<int> { 23, 45, 12, 67, 80, 19 };
//foreach (var item in sayilar)
//{
// Console.WriteLine(item);
//}
//Console.WriteLine("****");
//sayilar.Sort();
//Console.WriteLine("****");
//foreach (var item in sayilar)
//{
// Console.WriteLine(item);
//}
List<ogrenci> ogrenciler = new List<ogrenci>() {
new ogrenci { no=123, ad="Nagihan", soyad="Esendal" },
new ogrenci { no=235, ad="Rüya", soyad="Hakko" },
new ogrenci { no=136, ad="Şeyda", soyad="Kamalı" },
};
ogrenciler.Sort();
foreach (ogrenci ogr in ogrenciler)
{
Console.WriteLine(ogr.ToString());
}
}
}
}
Proje dosyasını buraya tıklayarak indirebilirsiniz.