Αυτό το άρθρο περιγράφει τη χρήση δύο διασυνδέσεις:
IComparer και
IComparable. Οι διασυνδέσεις αυτές αναφέρονται στο ίδιο άρθρο για δύο λόγους. Οι διασυνδέσεις αυτές συχνά χρησιμοποιούνται μαζί και παρόλο που οι διασυνδέσεις παρόμοιες (και έχουν ονόματα παρόμοια), που εξυπηρετούν διαφορετικούς σκοπούς.
Εάν έχετε έναν πίνακα τύπων (όπως
συμβολοσειρά ή
ακέραιος αριθμός) που υποστηρίζει ήδη
IComparer, μπορείτε να ταξινομήσετε το πίνακα χωρίς να παράσχει κάθε ρητή αναφορά
IComparer. Στην περίπτωση αυτή, διάχυση των στοιχείων του πίνακα την προεπιλεγμένη εφαρμογή
IComparer (
Comparer.Default) για εσάς. Ωστόσο, εάν θέλετε να παρέχουν τη δυνατότητα ταξινόμησης ή σύγκρισης για τα προσαρμοσμένα αντικείμενα, πρέπει να υλοποιήσετε μία ή και τις δύο αυτές τις διασυνδέσεις.
Τα παρακάτω.Σε αυτό το άρθρο αναφέρεται βιβλιοθήκη κλάσης NET Framework χώρου ονομάτων:
System.Collections
IComparable
Ο ρόλος των
IComparable είναι να παρέχει μια μέθοδο σύγκριση δύο αντικείμενα ενός συγκεκριμένου τύπου. Αυτό είναι απαραίτητο, εάν θέλετε να παρέχουν δυνατότητα παραγγελίας για το αντικείμενο. Σκεφτείτε
IComparable ως παρέχοντας μια προεπιλεγμένη σειρά ταξινόμησης για τα αντικείμενά σας. Για παράδειγμα, εάν έχετε έναν πίνακα με αντικείμενα του τύπου και να καλέσετε το
Ταξινόμηση η μέθοδος στον πίνακα αυτό,
IComparable παρέχει τη σύγκριση των αντικειμένων κατά την ταξινόμηση. Όταν εφαρμόσετε το
IComparable περιβάλλον εργασίας, πρέπει να υλοποιεί το
CompareTo μέθοδος, ως εξής:
// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
car c=(car)obj;
return String.Compare(this.make,c.make);
}
Σύγκριση της μεθόδου είναι διαφορετική ανάλογα με τον τύπο δεδομένων της τιμής που συγκρίνονται.
String.Compare χρησιμοποιείται σε αυτό το παράδειγμα, επειδή η ιδιότητα που έχει επιλεγεί για τη σύγκριση είναι μια συμβολοσειρά.
IComparer
Ο ρόλος των
IComparer είναι η παροχή μηχανισμών πρόσθετες σύγκρισης. Για παράδειγμα, μπορεί να θέλετε να δώσετε την παραγγελία σας κλάσης σε διάφορα πεδία ή ιδιότητες, αύξουσα και φθίνουσα σειρά στο ίδιο πεδίο ή και τα δύο.
Χρήση
IComparer είναι μια διαδικασία δύο βημάτων. Πρώτα, δηλώνετε μια κλάση που υλοποιεί
IComparer, και στη συνέχεια εφαρμόζει το
Σύγκριση μέθοδος:
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;
}
}
Σημειώστε ότι το
IComparer.Compare η μέθοδος απαιτεί τριτογενής σύγκρισης. 1, 0 ή -1 επιστρέφεται ανάλογα αν μία τιμή είναι μεγαλύτερη, ίση ή μικρότερη από το άλλο. Μπορεί να αλλάξει τη σειρά ταξινόμησης (αύξουσα ή φθίνουσα) εναλλάσσοντας λογικούς τελεστές σε αυτήν τη μέθοδο.
Το δεύτερο βήμα είναι να δηλώσει μια μέθοδο που επιστρέφει μια παρουσία σας
IComparer αντικείμενο:
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
Σε αυτό το παράδειγμα, το αντικείμενο χρησιμοποιείται ως το δεύτερο όρισμα όταν καλείτε το υπερφορτωμένο
Array.Sort η μέθοδος που δέχεται
IComparer. Η χρήση
IComparer δεν περιορίζεται σε πίνακες. Γίνεται αποδεκτή ως όρισμα σε αριθμό διαφορετικό συλλογής και κλάσεις ελέγχου.
Παράδειγμα βήμα προς βήμα
Το παρακάτω παράδειγμα παρουσιάζει τη χρήση αυτών των διασυνδέσεων. Για να αποδειχθεί
IComparer και
IComparable, μια κλάση με όνομα
αυτοκίνητο δημιουργείται. Το
αυτοκίνητο το αντικείμενο έχει την
κάνετε και
έτος Ιδιότητες. Αύξουσα ταξινόμηση για το
κάνετε το πεδίο είναι ενεργοποιημένο μέσω του
IComparable διασύνδεση και μια φθίνουσα ταξινόμηση για το
κάνετε το πεδίο είναι ενεργοποιημένο μέσω του
IComparer διασύνδεση. Αύξουσα και φθίνουσα ταξινόμηση παρέχονται για την
έτος η ιδιότητα μέσω της χρήσης
IComparer.
- Στη Visual C#, δημιουργήστε ένα νέο έργο εφαρμογής κονσόλας. Το όνομα της εφαρμογής ConsoleEnum.
- Μετονομασία Program.cs ως Host.cs και στη συνέχεια να αντικαταστήσετε τον κωδικό με τον παρακάτω κώδικα.
Σημείωση Στο Visual Studio.NET 2003, μετονομάστε το Class1.cs ως 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();
}
}
}
- Προσθήκη μιας κλάσης στο έργο. Το όνομα της κλάσης αυτοκίνητο.
- Αντικατάσταση κώδικα Car.cs με το εξής:
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();
}
}
}
- Εκτέλεση του έργου.
Στο παράθυρο κονσόλας εμφανίζεται το ακόλουθο αποτέλεσμα:
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