Bài t?ng bư?c này mô t? vi?c s? d?ng hai giao di?n:
IComparer và
IComparable. 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
IComparer và
IComparable, m?t l?p đ?t tên
xe đư?c t?o ra. Các
xe đ?i tư?ng có các
làm cho và
nă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.
- 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.
- Đ?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();
}
}
}
- Thêm m?t l?p h?c cho d? án. Tên l?p xe.
- 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();
}
}
}
- 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
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
| kbsweptvs2008 kbhowtomaster kbmt KB320727 KbMtvi |
Máy d?chQUAN 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
(http://support.microsoft.com/kb/320727/en-us/
)