ID Artikel: 320727 - Kajian Terakhir: 26 September 2011 - Revisi: 2.0

Cara menggunakan antarmuka IComparable dan IComparer di Visual C#

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

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.
  1. Dalam Visual C#, membuat proyek aplikasi konsol baru. Nama aplikasi ConsoleEnum.
  2. 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();
          }
       }
    }
    					
  3. Menambahkan kelas untuk proyek. Nama kelas mobil.
  4. 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();
          }
    
       }
    }
    					
  5. 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
    					

Berlaku bagi:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
Kata kunci: 
kbsweptvs2008 kbhowtomaster kbmt KB320727 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:320727  (http://support.microsoft.com/kb/320727/en-us/ )