.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