Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  Bir sınıf için IComparable arayüzünün implement edilmesi, o sınıfın örnekleri arasında "hangisi daha büyük, hangisi daha küçük" anlamında karşılaştırma yapılabileceğini gösterir. Bunun için IComparable kendisini implement eden sınıftan "int CompareTo(Object obj)" metodunu tanımlamasını ister.

Yani IComparable arayüzü şöyledir:
interface IComparable
{
    int CompareTo(Object obj);
}

Mesela Ogrenci adında bir sınıfımız olsun. Bu sınıfın Ad, Soyad, OkulNo gibi alanları olsun.
public class Ogrenci
{
    public string Ad;
    public string Soyad;
    public int OkulNo;
}

Elimizde tek boyutlu bir dizide listelenmiş 30 Ogrenci örneği var diyelim. Bunları sıralayarak göstermek istiyorsunuz. Aşağıdaki kodu yazarsınız.
// elimizde 1-A sınıfında okuyan 30 öğrenci var mesela.
Ogrenci[] ogrenciler = falancaServis.GetOgrenciArray("1-A");

// bu öğrencileri çıktıya yazmadan önce sıralamak istiyoruz.
Array.Sort(ogrenciler);

// şimdi çıktıya yazabiliriz.
foreach(Ogrenci ogr in ogrenciler)
    Console.WriteLine(ogr.OkulNo + " " + ogr.Ad + " " + ogr.Soyad);

Ne yazık ki, bu kod "At least one object must implement IComparable" şeklinde hata mesajı verir. Bunun sebebi Ogrenci örneklerinin nasıl sıralanacağını Array.Sort() metodunun bilmemesidir. Bu metoda bir şekilde Ogrenci'lerin okul numaralarına göre sıralanması gerektiğini söylemeliyiz. Bunu yapmanın yolu Ogrenci sınıfında IComparable arayüzünü implement etmektir. Aşağıdaki gibi:

public class Ogrenci : IComparable
{
    public string Ad;
    public string Soyad;
    public int OkulNo;

    public int CompareTo(object obj)
    {
        Ogrenci karsilastirilacakOrnek = (Ogrenci) obj;
        return this.OkulNo - karsilastirilacakOrnek.OkulNo;
    }
}

Buraya kadar herşey açık görünüyor. Sadece "CompareTo metodunun dönüş değerinin tipi neden int ve neden iki oğrencilerin okul numaraları farkını döndürdük?" kapalı kalmış olabilir. CompareTo() metodu hakkında dökümana baktığımızda şunu görüyoruz : Eğer elimizdeki nesne parametre olarak geçilen nesneden büyükse pozitif, eşitse sıfır, kiçikse negatif bir tamsayı döndürmemiz gerekiyor. Bu yüzden biz de iki okul numarası arasındaki farkı döndürerek istenilen kuralı uygulamış olduk.

Ogrenci sınıfını bu şekilde değiştirdikten sonra kodumuz hatasız çalışır. Peki ya öğrencileri Ad veya Soyad alanına göre de sıralamak isteseydik ne yapacaktık? Bunun için bkz: IComparer.
fizikci
21 Kasım 2005 13:20
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
© 2005, Bilişim Kulübü. (1125 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen