.NET ile Sorting / Sıralama
IComparable kullanımı
Bir obje kümesinin, içinde bulunan objelerin her hangi bir özelliğine göre sıralanması
sıkça karşılaşabileceğimiz bir ihtiyaçtır. Geçmişte bu işlemi yapmak için bubble
sort, quick sort veya veril yapıları dersinde öğrendiğimiz daha yetkin sort algortimalarını
kullanarak kendi kodumuz yazmamız gerekiyordu. .NET framework’u sıralama(sorting)
işini bizim için çözüyor. Bizim tek yapmamız gereken objenin, hangi özelliğine göre
sıralanacağını belirlememiz.
Bir ogrenci sınıfımız olduğunu düşünelim. Öğrenci sınıfımız, 3 özellik barındırıyor
olsun; isim, soyad ve yaş.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace
Sorting
{
class Ogrenci
{
private string m_isim;
private string m_soyad;
private int m_yas;
public Ogrenci()
{
m_yas = 0;
}
public Ogrenci(string ad,string soyad,int yas)
{
m_isim = isim;
m_soyad = soyad;
m_yas = yas;
}
#region public string isim
public string isim
{
get
{
return m_isim;
}
set
{
m_isim = value;
}
}
#endregion
#region soyad
public string soyad
{
get
{
return m_soyad;
}
set
{
m_soyad = value;
}
}
#endregion
#region yas
public int yas
{
get
{
return m_yas;
}
set
{
m_yas = value;
}
}
#endregion
}
}
İstediğimiz öğrencilerimizin yaşlarına göre sıralanması olsun. Yapmamız gereken
2 şey var.
- Sınıfımızı IComparable sınıfından inherit edeceğiz.
class Ogrenci :
IComparable
- Sınıfımızın içine public bir CompareTo fonksiyonu ekleyip. Sınıfımızın karşılaştırma
kriterini yerleştireceğiz.
public int CompareTo(Object
obj)
{
Ogrenci objOgrenci = (Ogrenci)
obj;
return this.m_yas.CompareTo(objOgrenci.yas);
}
Bu durumda sınıfımızın son hali aşağıdaki gibi oluyor. Sınıfı sıralanabilir hale
getirebilmek için eklediğimiz kodu bold olarak yazdım.
class Ogrenci :
IComparable
{
private string m_isim;
private string m_soyad;
private int m_yas;
public Ogrenci()
{
m_yas = 0;
}
public Ogrenci(
string ad,
string soyad,
int yas)
{
m_isim = isim;
m_soyad = soyad;
m_yas = yas;
}
#region public string isim
public string isim
{
get
{
return m_isim;
}
set
{
m_isim = value;
}
}
#endregion
#region soyad
public string soyad
{
get
{
return m_soyad;
}
set
{
m_soyad = value;
}
}
#endregion
#region yas
public int yas
{
get
{
return m_yas;
}
set
{
m_yas = value;
}
}
#endregion
public int CompareTo(Object
obj)
{
Ogrenci objOgrenci = (Object)
obj;
return this.m_yas.CompareTo(objOgrenci.yas);
}
}
Sıralanabilir sınıfımızın nasıl çalıştığını görmek için küçük bir uygulama örnek
kodu koydum. 4 tane ögrenci objesi yaratıp bunları rastgele(sırasız) bir şekilde
alOgrenciler isimli arraylist e ekliyorum. Ardından sort method unu çağırarak sıralıyorum.
Son olarak da sıralanmış öğrencileri textBox1 isimli multiline textBox da görüntülüyorum.
private void Form1_Load(object
sender, EventArgs e)
{
Ogrenci ogr1 = new Ogrenci("Ahmet",
"Cam", 23);
Ogrenci ogr2 = new Ogrenci("Ayşe",
"Rüzgar", 21);
Ogrenci ogr3 = new Ogrenci("Veli",
"Yağmur", 19);
Ogrenci ogr4 = new Ogrenci("Pelin",
"Su", 41);
ArrayList alOgrenciler = new
ArrayList();
alOgrenciler.Add(ogr1);
alOgrenciler.Add(ogr2);
alOgrenciler.Add(ogr3);
alOgrenciler.Add(ogr4);
alOgrenciler.Sort();
string OgrenciListesi = "";
foreach (Ogrenci ogr in alOgrenciler)
{
OgrenciListesi += ogr.isim + " " + ogr.soyad +
Environment.NewLine;
}
textBox1.Text = OgrenciListesi;
}
Tersten Sıralama
Aynı arraylist’i tersten sıralamak istersek; sınıfımız içindeki CompareTo fonksiyonunda
parametre olarak geçilen ve karşılatırılan objelerin yerlerini değiştiriyoruz. Artık
objelerimiz tersten sıralanıyor.
public int CompareTo(Object
obj)
{
Ogrenci objOgrenci = (Ogrenci)
obj;
//return this.m_yas.CompareTo(objOgrenci.yas) //bir onceki
hali
return objOgrenci.yas.CompareTo(this.m_yas);
}
<- Makaleler Sayfasına Dön