.Net’de birçok noktada karşılaştırma, sıralama vb işlemler yapmak isteyebiliriz. Framework’de varolan birçok sınıf için bu işlemleri yapmak son derece kolaydır. Mesela 1 adet integer dizimiz olsun., Bu diziyi Array sınıfının static olan Sort metoduna vererek, içindeki elemanların küçükten büyüğe sıralanmasını sağlayalım :
int[] sayilar = { 4, 7, 1, 3, 2, 6, 5, 8 };
Array.Sort(sayilar);
foreach (int sayi in sayilar)
{
Console.WriteLine(sayi);
}
Kodumuzu çalıştırdığımızda hatasız bir şekilde sonucu elde ederiz.
Şimdi de Urun adında bir sınıf yazalım ve aynı sıralam işlemini, Urun tipinden bir dizi oluşturarak deneyelim.
class Urun
{
public int Id;
public string Ad;
public double Fiyat;
public Urun(int id, string ad, double fiyat)
{
Id = id;
Ad = ad;
Fiyat = fiyat;
}
}
class Program
{
static void Main(string[] args)
{
Urun[] urunler =
{
new Urun(1,"Sandalye",100),
new Urun (2,"Masa",240),
new Urun(3,"Sehpa",65)
};
Array.Sort(urunler); // Bu satırda hata alırız!
foreach (Urun u in urunler)
{
Console.WriteLine(u.Ad);
}
}
}
Yukarıdaki kodu çalıştırdığımızda, çalışma zamanında şu şekilde bir hata alırız.
“Failed to compare two elements in the array.”
Nedenini tahmin etmek çok da zor değil aslında. Urun tipinden bir diziyi Sort metoduna verdik ama hangi kurala göre karşılaştırma yapıldığını belirtmediğimiz için hata aldık.
Peki integer dizisinin karşılaştırılma kuralları neye göre belirlenmiş? Bunu öğrenmek için hemen int tipinin üzerine giderek “Go to Definition” ( F12 ) diyelim.
İşte gördüğümüz bu interface, yazıldığı sınıfa bahsettiğimiz karşılaştırma kuralını kazandıran nesnedir. Ineger nesneleri bu interface’in belirlediği kural sayesinde karşılaştırılabilir birer tip haline gelmişlerdir.
Şimdi de yazdığımız Urun sınıfına bu interface’I implement edelim ve sınıfımıza kazandıracağı üyelere bir göz atalım.
class Urun : IComparable
{
public int Id;
public string Ad;
public double Fiyat;
public Urun(int id, string ad, double fiyat)
{
Id = id;
Ad = ad;
Fiyat = fiyat;
}
public int CompareTo(object obj)
{
throw new NotImplementedException();
}
}
IComperable interface’ini implement eden sınıf, CompareTo metoduna gövde kazandırmak zorundadır. Hatırlatmakta fayda var, interface’ler, içindeki tüm üyeleri abstract olan sınıflardır. Dolayısı ile uygulandıkları sınıflarda, abstract olan bu üyelerin gövdeleri yazılmalıdır. Bu hatırlatmadan sonra Urun nesnelerimizin hangi kurala göre karşılaştırılacağını CompareTo metodu içerisinde belirtmeye çalışalım. Bu örnek için, Urun nesnelerinin Fiyatlarına göre karşılaştırma yapılmasını istediğimizi varsayalım.
class Urun : IComparable
{
public int Id;
public string Ad;
public double Fiyat;
public Urun(int id, string ad, double fiyat)
{
Id = id;
Ad = ad;
Fiyat = fiyat;
}
public int CompareTo(object obj)
{
Urun gelenUrun = (Urun)obj;
if (this.Fiyat > gelenUrun.Fiyat)
return 1;
else if (this.Fiyat < gelenUrun.Fiyat)
return -1;
else
return 0;
}
}
Sort metodu arka tarafta kullandığı bir algoritma ile gelen dizi içerisinden iki elemanı seçer, CompareTo metodunun belirttiği kurala göre bu iki elemanı karşılaştırır ve sonuca göre de elemanları sıralar. Burada “this.Fiyat” ile belirttiğimiz fiyat değeri , non-static olan CompareTo metodu hangi ürün üzerinden çağırılıyorsa o ürünün fiyatıdır. “gelenUrun.Fiyat” ise bu metoda parametre olarak verilen ürünün fiyatıdır.
Urun sınıfına uyguladığımız IComparable interface’I sayesinde, Sort metodu neye göre karşılaştırma yapacağını artık bilebilir. Şimdi yukarıda yaptığımız örneği tekrar deneyelim ve sonucu görmeye çalışalım.
class Program
{
static void Main(string[] args)
{
Urun[] urunler =
{
new Urun(1,"Sandalye",100),
new Urun (2,"Masa",240),
new Urun(3,"Sehpa",65)
};
Array.Sort(urunler);
foreach (Urun u in urunler)
{
Console.WriteLine(u.Ad);
}
}
}
Ekran çıktısından da görüldüğü gibi, fiyatı en ucuz olan üründen en pahalı olana doğru bir sıralam yapılmıştır. Bu sıralamanın yapılmasındaki kuralı IComparable interface’I belirlemiştir.
4 yorum:
Gayet faydalı ve güzel bir açıklama
Eline sağlık.
Sort metoduna verdik ama hangi kurala göre karşılaştırma yapıldığını belirtmediğimiz için hata aldık.
demek yerine
Sort metoduna verdik ama hangi verip tipine göre
demek daha doğru değilmi
çünkü urun nesnesi içinde 3 adet veri tipi var
"Kural"dan kastım daha genel bir durum aslında. Olayı sadece veri tipine bağlamamalıyız. Kullanacağımız veri tipinin bir takım matematiksel işlemlerden geçebileceği bir senaryoda (yani fiyatların büyüklük küçüklük kontrolü dışında ekstra hesaplar yapılabilir) "karşılaştırma kuralı" ibaresini daha anlamlı buluyorum.
Bu bir yorumdur ve algılama biçimidir. Siz de gördüklerinizi kendinizce yorumlayabilirsiniz.
Yorum Gönder