Artikel ini selangkah demi selangkah menjelaskan penggunaan dua antarmuka:
IComparer dan
IComparable. Antarmuka ini dibahas dalam artikel yang sama untuk dua alasan. Antarmuka ini sering digunakan bersama-sama, dan meskipun antarmuka sama (dan memiliki nama yang sama), mereka melayani tujuan yang berbeda.
Jika Anda memiliki sebuah array dari jenis (seperti
string atau
bilangan bulat) yang sudah mendukung
IComparer, Anda dapat mengurutkan array itu tanpa memberikan setiap rujukan yang eksplisit
IComparer. Dalam hal ini, elemen array dilemparkan ke pelaksanaan standar
IComparer (
Comparer.default) untuk Anda. Namun, jika Anda ingin memberikan kemampuan menyortir atau perbandingan untuk objek Anda kustom, Anda harus menerapkan salah satu atau kedua antarmuka ini.
Berikut.NET Framework kelas perpustakaan namespace direferensikan dalam artikel ini:
System.Collections
IComparable
Peran
IComparable adalah untuk menyediakan metode untuk membandingkan dua objek dari tipe tertentu. Hal ini diperlukan jika Anda ingin memberikan kemampuan setiap pemesanan untuk Anda objek. Pikirkan
IComparable sebagai menyediakan default urutan untuk Anda objek. Sebagai contoh, jika Anda memiliki sebuah array dari jenis Anda, dan Anda memanggil
Urut metode pada array itu,
IComparable memberikan perbandingan objek pada jenis. Ketika Anda menerapkan
IComparable antarmuka, Anda harus menerapkan
CompareTo metode, sebagai berikut:
// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
car c=(car)obj;
return String.Compare(this.make,c.make);
}
Perbandingan dalam metode berbeda tergantung pada jenis data nilai yang menjadi dibandingkan.
String.Compare digunakan dalam contoh ini karena properti yang dipilih untuk perbandingan string.
IComparer
Peran
IComparer adalah untuk menyediakan mekanisme perbandingan tambahan. Sebagai contoh, Anda mungkin ingin memberikan memesan dari kelas Anda pada beberapa bidang atau properti, naik dan urutan pada bidang yang sama, atau keduanya.
Menggunakan
IComparer adalah dua langkah proses. Pertama, menyatakan kelas yang mengimplementasikan
IComparer, dan kemudian menerapkan
Membandingkan metode:
private class sortYearAscendingHelper : IComparer
{
int IComparer.Compare(object a, object b)
{
car c1=(car)a;
car c2=(car)b;
if (c1.year > c2.year)
return 1;
if (c1.year < c2.year)
return -1;
else
return 0;
}
}
Perhatikan bahwa
IComparer.Compare metode memerlukan perbandingan tersier. 1, 0, atau -1 kembali tergantung pada apakah satu nilai lebih besar dari, sama dengan, atau kurang dari yang lain. Urutan (urutan z-a atau a-z) dapat diubah dengan beralih logical operator dalam metode ini.
Langkah kedua adalah untuk menyatakan metode yang mengembalikan sebuah instance dari Anda
IComparer objek:
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
Dalam contoh ini, objek digunakan sebagai argumen kedua ketika Anda menelepon kelebihan beban
Array.sort metode yang menerima
IComparer. Penggunaan
IComparer ini tidak terbatas untuk array. Itu diterima sebagai argumen di sejumlah koleksi berbeda dan kontrol kelas.
Contoh langkah demi langkah
Contoh berikut menunjukkan penggunaan antarmuka ini. Untuk menunjukkan
IComparer dan
IComparable, kelas bernama
mobil dibuat. The
mobil objek telah
membuat dan
tahun properti. Urutkan mendaki untuk
membuat bidang diaktifkan melalui
IComparable antarmuka, dan semacam menurun pada
membuat bidang diaktifkan melalui
IComparer antarmuka. Baik naik dan turun macam yang disediakan untuk
tahun properti melalui
IComparer.
- Dalam Visual C#, membuat proyek aplikasi konsol baru. Nama aplikasi ConsoleEnum.
- Ubah nama Program.cs sebagai Host.cs, dan kemudian mengganti kode dengan kode berikut.
Catatan Dalam Visual Studio.NET 2003, mengubah nama Class1.cs sebagai Host.cs.
using System;
namespace ConsoleEnum
{
class host
{
[STAThread]
static void Main(string[] args)
{
// Create an arary of car objects.
car[] arrayOfCars= new car[6]
{
new car("Ford",1992),
new car("Fiat",1988),
new car("Buick",1932),
new car("Ford",1932),
new car("Dodge",1999),
new car("Honda",1977)
};
// Write out a header for the output.
Console.WriteLine("Array - Unsorted\n");
foreach(car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo IComparable by sorting array with "default" sort order.
Array.Sort(arrayOfCars);
Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");
foreach(car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo ascending sort of numeric value with IComparer.
Array.Sort(arrayOfCars,car.sortYearAscending());
Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");
foreach(car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo descending sort of string value with IComparer.
Array.Sort(arrayOfCars,car.sortMakeDescending());
Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");
foreach(car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
// Demo descending sort of numeric value using IComparer.
Array.Sort(arrayOfCars,car.sortYearDescending());
Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");
foreach(car c in arrayOfCars)
Console.WriteLine(c.Make + "\t\t" + c.Year);
Console.ReadLine();
}
}
}
- Menambahkan kelas untuk proyek. Nama kelas mobil.
- Ganti kode dalam Car.cs dengan berikut:
using System;
using System.Collections;
namespace ConsoleEnum
{
public class car : IComparable
{
// Beginning of nested classes.
// Nested class to do ascending sort on year property.
private class sortYearAscendingHelper: IComparer
{
int IComparer.Compare(object a, object b)
{
car c1=(car)a;
car c2=(car)b;
if (c1.year > c2.year)
return 1;
if (c1.year < c2.year)
return -1;
else
return 0;
}
}
// Nested class to do descending sort on year property.
private class sortYearDescendingHelper: IComparer
{
int IComparer.Compare(object a, object b)
{
car c1=(car)a;
car c2=(car)b;
if (c1.year < c2.year)
return 1;
if (c1.year > c2.year)
return -1;
else
return 0;
}
}
// Nested class to do descending sort on make property.
private class sortMakeDescendingHelper: IComparer
{
int IComparer.Compare(object a, object b)
{
car c1=(car)a;
car c2=(car)b;
return String.Compare(c2.make,c1.make);
}
}
// End of nested classes.
private int year;
private string make;
public car(string Make,int Year)
{
make=Make;
year=Year;
}
public int Year
{
get {return year;}
set {year=value;}
}
public string Make
{
get {return make;}
set {make=value;}
}
// Implement IComparable CompareTo to provide default sort order.
int IComparable.CompareTo(object obj)
{
car c=(car)obj;
return String.Compare(this.make,c.make);
}
// Method to return IComparer object for sort helper.
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
// Method to return IComparer object for sort helper.
public static IComparer sortYearDescending()
{
return (IComparer) new sortYearDescendingHelper();
}
// Method to return IComparer object for sort helper.
public static IComparer sortMakeDescending()
{
return (IComparer) new sortMakeDescendingHelper();
}
}
}
- Menjalankan proyek.
Output berikut muncul di jendela konsol:
Array - Unsorted
Ford 1992
Fiat 1988
Buick 1932
Ford 1932
Dodge 1999
Honda 1977
Array - Sorted by Make (Ascending - IComparable)
Buick 1932
Dodge 1999
Fiat 1988
Ford 1932
Ford 1992
Honda 1977
Array - Sorted by Year (Ascending - IComparer)
Ford 1932
Buick 1932
Honda 1977
Fiat 1988
Ford 1992
Dodge 1999
Array - Sorted by Make (Descending - IComparer)
Honda 1977
Ford 1932
Ford 1992
Fiat 1988
Dodge 1999
Buick 1932
Array - Sorted by Year (Descending - IComparer)
Dodge 1999
Ford 1992
Fiat 1988
Honda 1977
Buick 1932
Ford 1932