Selamlar,
Kısaca açıklaması; IComparable Interface’i, miras alan sınıfa CompareTo metodunu uygulatmakta ve bu metot aracılığıyla karşılaştırmayı sağlamaktadır.
List<int>() gibi önceden tanımlanmış bir veri tipine sahip bir koleksiyon kullandığımızda sıralamanın çok kolay olduğunu biliyoruz. Sıralamayı önemseyen Sort() yöntemi mevcuttur.
Ancak, kullanıcı tanımlı bir veri türüyle çalışırken veya bir nesneyi özelliğine göre sıralamak istediğimizde sıralama nasıl uygulanır?
Kullanıcı tanımlı nesnelerin bir koleksiyonu üzerinde Sort() yöntemini deneyelim.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SelfHostingWebAPI
{
public class Person
{
public Int16 ID { get; set; }
public string name { get; set; }
public string surname { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Person> per = new List<Person>()
{
new Person{ID=1,name="sourav",surname="kayal"},
new Person{ID=2,name="Ram",surname="kumar"}
};
per.Sort();
Console.ReadLine();
}
}
}
Ve işte yukarıdaki örneğin çıktısı.
Yani, çalışma zamanı iki nesneyi karşılaştıramayacağını söylüyor çünkü bu nesneler kullanıcı tanımlı ve sınıfta iki nesneyi karşılaştıracak bir mekanizma yok.
Bu sorunu çözmek için sınıfımızda bir IComparable arabirimi uygulayacağız ve CompareTo() yöntemini uygulayacağız.
Uygulamaya geçmeden önce IComparable arayüzünün ne olduğunu, metodunu ve özelliklerini görelim.
.NET sınıf kitaplığında IComparable arabiriminin konumu
Namespace: System
Assembly: mscorlib.dll
IComparable arabiriminin sözdizimi
Public interface IComparable
Başka bir deyişle, bu arayüze başka bir arayüz uygulamaz.
Yöntemler (Methods)
Aşağıdaki gibi yalnızca bir yöntem içerir:
CompareTo(): Geçerli örneği aynı türdeki başka bir nesneyle karşılaştırır ve geçerli örneğin diğer nesneyle sıralama düzeninde aynı konumda olup olmadığını belirten bir tamsayı döndürür.
Şimdi IComparable arayüzünü kendi sınıfımızda uygulayalım. Aşağıdaki örneğe bir göz atabilirsiniz.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SelfHostingWebAPI
{
public class Person : IComparable<Person>
{
public Int16 ID { get; set; }
public string name { get; set; }
public string surname { get; set; }
public int CompareTo(Person other)
{
if (this.ID > other.ID)
return 1;
else if (this.ID < other.ID)
return -1;
else
return 0;
}
}
class Program
{
static void Main(string[] args)
{
List<Person> per = new List<Person>()
{
new Person{ID=3,name="sourav",surname="kayal"},
new Person{ID=1,name="Ram",surname="kumar"},
new Person{ID=2,name="Sudip",surname="Das"}
};
//Apply sort method in user defined object's collection
per.Sort();
foreach (Person p in per)
{
Console.WriteLine(p.ID + " " + p.name + " " + p.surname);
}
Console.ReadLine();
}
}
}
Ve işte rulo numarasına bağlı olarak sıralı listem.
Yukarıdaki örnekte, karşılaştırmaya bağlı olarak 0,1 ve -1 değerlerini döndürüyorduk. Herhangi bir değer döndürmezsek, nesnelerin iki özelliğinden farklı bir değer döndürür. Bu örneğe bir göz atın. Burada iki nesnenin maaş özelliğini karşılaştırıyoruz.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SelfHostingWebAPI
{
public class Person : IComparable
{
public string name { get; set; }
public Int16 SalaryAmount { get; set; }
public int CompareTo(object obj)
{
if (obj == this)
return 1;
else
return this.SalaryAmount.CompareTo(this.SalaryAmount);
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.name = "Sourav";
p1.SalaryAmount = 1500;
Person p2 = new Person();
p2.name = "Ram";
p2.SalaryAmount = 1000;
Console.WriteLine("Diffrence between salary of p1 and p2");
Console.WriteLine(p1.SalaryAmount.CompareTo(p2.SalaryAmount));
Console.ReadLine();
}
}
}
Ve p1 ve p2'nin maaş farkı 500'dür.
Umarım açıklayıcı ve bilgilendirici olmuştur.
Teşekkürler