Genel amaçlı koleksiyonlar içerisinde veri tipi fark etmeksizin her türlü veriyi saklayabiliriz. İnt, string, char gibi standart tiplerdeki verilerle birlikte; yazmış olduğumuz sınıflardan elde ettiğimiz nesneleri de koleksiyonlar içerisinde tutabiliriz. Konuya ilişkin bir örnek vermek gerekirse;
class Ogrenci { int Numara; string Isim; int Sinif; public Ogrenci(int n,string i,int s) { Numara = n; Isim = i; Sinif = s; } public override string ToString() { return string.Format("No:{0,-20} İsim:{1,-20} Sınıf:{2,-20}",Numara,Isim,Sinif); } } class Program { static void Main(string[] args) { ArrayList Ogrenciler = new ArrayList(); Ogrenciler.Add(new Ogrenci(128, "Serdar Yılmaz", 8)); Ogrenciler.Add(new Ogrenci(134, "Ümit Özkan", 7)); Ogrenciler.Add(new Ogrenci(115, "Kadir Aydemir", 6)); foreach (Ogrenci ogr in Ogrenciler) Console.WriteLine(ogr); } }
Yukarıdaki örneğimizde; “Ogrenci” sınıfından oluşturduğumuz nesneleri ArrayList koleksiyonunda sakladık ve foreach döngüsünü kullanarak koleksiyon içerisinde yer alan nesnelere ait bilgileri ekrana yazdırdık. Ekran çıktısı:
No:128 İsim:Serdar Yılmaz Sınıf:8
No:134 İsim:Ümit Özkan Sınıf:7
No:115 İsim:Kadir Aydemir Sınıf:6
Görüldüğü üzere koleksiyon içerisinde, yazmış olduğumuz sınıfa ait nesneleri rahatlıkla tutabilmekteyiz. Ancak bu koleksiyonu sıralamak istediğimizde hata verecektir çünkü koleksiyon, içerisinde bulunan nesneleri neye göre sıralayacağı (Numaraya göre mi, isme göre mi, sınıfa göre mi) bilgisine sahip değildir. Kendi oluşturduğumuz sınıflara ait nesnelerin bir koleksiyon tarafından sıralanmasına imkan vermek amacıyla IComparable veya IComparer arayüzlerini kullanabiliriz.
IComparable Arayüzü
IComparable arayüzü içerisinde tek bir metot tanımlanmıştır.
- CompareTo(object nesne)
Nesnelerin neye göre sıralanacağını bu metot ile belirlemekteyiz. Metodu çağıran nesne ile argüman olarak girilen nesneyi karşılaştırmaktadır.class Ogrenci: IComparable { int Numara; string Isim; int Sinif; public Ogrenci(int n,string i,int s) { Numara = n; Isim = i; Sinif = s; } public override string ToString() { return string.Format("No:{0,-20} İsim:{1,-20} Sınıf:{2,-20}",Numara,Isim,Sinif); } // Nesneleri "Numara" değerlerine göre karşılaştıracaktır. public int CompareTo(object nesne) { Ogrenci ogr = (Ogrenci)nesne; return Numara.CompareTo(ogr.Numara); } } class Program { static void Main(string[] args) { ArrayList Ogrenciler = new ArrayList(); Ogrenciler.Add(new Ogrenci(128, "Serdar Yılmaz", 8)); Ogrenciler.Add(new Ogrenci(134, "Ümit Özkan", 7)); Ogrenciler.Add(new Ogrenci(115, "Kadir Aydemir", 6)); Console.WriteLine("Sıralama Yapılmadan Önce:"); foreach (Ogrenci ogr in Ogrenciler) Console.WriteLine(ogr); // Koleksiyon içerisindeki nesneleri "Numara" değerlerine göre sıralayacaktır. Ogrenciler.Sort(); Console.WriteLine("Sıralama Yapıldıktan Sonra:"); foreach (Ogrenci ogr in Ogrenciler) Console.WriteLine(ogr); } }
IComparer Arayüzü
IComparer arayüzü içerisinde tek bir metot tanımlanmıştır. IComparable arayüzünden farkı; Arayüzü kendi oluşturduğumuz sınıfa uygulamak yerine ayrı bir sınıf oluşturup ona uygulamaktayız. Oluşturduğumuz yeni sınıftan bir nesne elde edip, Sort() metoduna parametre olarak vererek sıralama işlemini gerçekleştirmekteyiz.
- Compare(object nesne1, object nesne2)
Nesne 1 ile Nesne 2’yi karşılaştırarak sıralama işleminin yapılmasını sağlamaktadır.class OgrKarsilastir : IComparer { // Nesne 1 ile Nesne 2'yi "Numara" değerlerine göre karşılaştıracaktır. public int Compare(object nesne1, object nesne2) { Ogrenci ogr1 = (Ogrenci)nesne1; Ogrenci ogr2 = (Ogrenci)nesne2; return ogr1.Numara.CompareTo(ogr2.Numara); } } class Ogrenci { public int Numara; string Isim; int Sinif; public Ogrenci(int n,string i,int s) { Numara = n; Isim = i; Sinif = s; } public override string ToString() { return string.Format("No:{0,-20} İsim:{1,-20} Sınıf:{2,-20}",Numara,Isim,Sinif); } } class Program { static void Main(string[] args) { OgrKarsilastir karsilastir = new OgrKarsilastir(); ArrayList Ogrenciler = new ArrayList(); Ogrenciler.Add(new Ogrenci(128, "Serdar Yılmaz", 8)); Ogrenciler.Add(new Ogrenci(134, "Ümit Özkan", 7)); Ogrenciler.Add(new Ogrenci(115, "Kadir Aydemir", 6)); Console.WriteLine("Sıralama Yapılmadan Önce:"); foreach (Ogrenci ogr in Ogrenciler) Console.WriteLine(ogr); // Arayüzün uygulandığı sınıftan oluşturduğumuz nesneyi argüman olarak girdik. Ogrenciler.Sort(karsilastir); Console.WriteLine("Sıralama Yapıldıktan Sonra:"); foreach (Ogrenci ogr in Ogrenciler) Console.WriteLine(ogr); } }
Serdar YILMAZ