Ana Sayfa  |  İletişim  |  About   |  Soru Yönelt
Ürünler
SupportAlive
OTS
Haberci
Performans Değerlendirme
AdPort Banner Yönetimi
Anket Yönetimi
MailPort
WebTrends
Hizmetler
Google Analytics
Web Analizi
Başarı Hikayeleri
Portakalofis
Referanslar
Makaleler
Bültenler
Basında
İletişim
About
Kariyer
 HyperLink


.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.

  1. Sınıfımızı IComparable sınıfından inherit edeceğiz.

    class Ogrenci : IComparable

  2. 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

 

© Portakal Yazılım ve Danışmanlık Ltd. Şti. 2006 Tel:0 212 356 74 20 E-Posta: iletisim@portakalofis.com Forte B2B - Üretici ve Dağıtımcılar için E-iş Çözümü