Làm th? nào đ? s? d?ng giao di?n IComparable và IComparer trong Visual C#

ID c?a bài: 320727 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Bài t?ng bư?c này mô t? vi?c s? d?ng hai giao di?n: IComparerIComparable. Các giao di?n này s? đư?c th?o lu?n trong bài vi?t v? hai l? do. Các giao di?n này thư?ng đư?c s? d?ng v?i nhau, và m?c dù các giao di?n tương t? (và có tên tương t?), h? ph?c v? m?c đích khác nhau.

N?u b?n có m?t m?ng c?a các lo?i (ví d? như chu?i ho?c s? nguyên) mà đ? h? tr? IComparer, b?n có th? s?p x?p m?ng đó mà không cung c?p b?t k? tham chi?u r? ràng đ? IComparer. Trong trư?ng h?p đó, các y?u t? c?a m?ng di?n viên th?c hi?n m?c đ?nh IComparer (Comparer.Default) cho b?n. Tuy nhiên, n?u b?n mu?n cung c?p kh? năng phân lo?i ho?c so sánh các đ?i tư?ng tùy ch?nh c?a b?n, b?n ph?i th?c hi?n m?t trong hai ho?c c? hai các giao di?n này.

Sau đây.Không gian tên thư vi?n l?p NET Framework đư?c tham chi?u trong bài vi?t này:
System.collections

IComparable

Vai tr? c?a IComparable là cung c?p m?t phương pháp so sánh hai đ?i tư?ng c?a m?t lo?i h?nh c? th?. Đi?u này là c?n thi?t n?u b?n mu?n cung c?p b?t k? kh? năng s?p đ?t cho đ?i tư?ng c?a b?n. H?y suy ngh? c?a IComparable như cung c?p m?t th? t? s?p x?p m?c đ?nh cho các đ?i tư?ng c?a b?n. Ví d?, n?u b?n có m?t m?ng c?a các đ?i tư?ng c?a lo?i h?nh c?a b?n, và b?n g?i các S?p x?p phương pháp trên m?ng đó, IComparable cung c?p các so sánh c?a các đ?i tư?ng trong phân lo?i. Khi b?n th?c hi?n các IComparable giao di?n, b?n ph?i th?c hi?n các CompareTo phương pháp, như sau:
// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
   car c=(car)obj;
   return String.Compare(this.make,c.make);

}
				
So sánh trong phương pháp là khác nhau tùy thu?c vào ki?u d? li?u giá tr? mà đang đư?c so sánh. String.Compare đư?c s? d?ng trong ví d? này b?i v? các tài s?n đư?c ch?n cho vi?c so sánh là m?t chu?i.

IComparer

Vai tr? c?a IComparer là cung c?p cơ ch? so sánh b? sung. Ví d?, b?n có th? mu?n cung c?p đ?t hàng c?a l?p h?c c?a b?n vào m?t s? l?nh v?c ho?c tài s?n, tăng d?n và th? t? gi?m d?n trên cùng m?t l?nh v?c, ho?c c? hai.

B?ng cách s? d?ng IComparer là m?t quá tr?nh hai bư?c. Trư?c tiên, tuyên b? m?t l?p h?c th?c hi?n IComparer, và sau đó th?c hi?n các So sánh phương pháp:
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;
   }
}
				
Lưu ? r?ng các IComparer.Compare phương pháp đ?i h?i m?t so sánh Đ? Tam. 1, 0, ho?c -1 đư?c tr? l?i tùy thu?c vào m?t giá tr? là l?n hơn, b?ng, ho?c ít hơn khác. Th? t? s?p x?p (Tăng d?n ho?c gi?m d?n) có th? đư?c thay đ?i b?ng cách chuy?n các nhà khai thác h?p l? trong phương pháp này.

Bư?c th? hai là tuyên b? m?t phương pháp mà tr? v? m?t th? hi?n c?a b?n IComparer đ?i tư?ng:
public static IComparer sortYearAscending()
{      
   return (IComparer) new sortYearAscendingHelper();
}
				
Trong ví d? này, các đ?i tư?ng đư?c s? d?ng như là đ?i s? th? hai khi b?n g?i các b? quá t?i Array.sort phương pháp ch?p nh?n IComparer. Vi?c s? d?ng IComparer không ph?i là gi?i h?n trong m?ng. Nó đư?c ch?p nh?n như là đ?i s? m?t trong m?t s? b? sưu t?p khác nhau và ki?m soát các l?p h?c.

Ví d?-by-step

Ví d? sau cho th?y vi?c s? d?ng các giao di?n này. Đ? ch?ng minh IComparerIComparable, m?t l?p đ?t tên xe đư?c t?o ra. Các xe đ?i tư?ng có các làm chonăm b?t đ?ng s?n. M?t s?p x?p tăng d?n cho các làm cho trư?ng đư?c kích ho?t thông qua các IComparable giao di?n, và m?t s?p x?p gi?m d?n vào các làm cho trư?ng đư?c kích ho?t thông qua các IComparer giao di?n. C? hai tăng d?n và gi?m d?n các lo?i đư?c cung c?p cho các năm b?t đ?ng s?n thông qua vi?c s? d?ng các IComparer.
  1. Trong Visual C#, t?o ra m?t d? án ?ng d?ng giao di?n đi?u khi?n m?i. Tên ?ng d?ng ConsoleEnum.
  2. Đ?i tên Program.cs như Host.cs, và sau đó thay th? m? v?i đo?n m? sau.

    Chú ý Trong ph?ng thu tr?c quan.NET 2003, đ?i tên Class1.cs như 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. Thêm m?t l?p h?c cho d? án. Tên l?p xe.
  4. Thay th? m? trong Car.cs v?i nh?ng đi?u sau đây:
    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. Ch?y các d? án. Đ?u ra sau đây s? xu?t hi?n trong c?a s? giao di?n đi?u khi?n:
    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
    					

Thu?c tính

ID c?a bài: 320727 - L?n xem xét sau cùng: 27 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
T? khóa: 
kbsweptvs2008 kbhowtomaster kbmt KB320727 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:320727

Cung cấp Phản hồi