Αναγν. άρθρου: 320727 - Τελευταία αναθεώρηση: Κυριακή, 29 Μαΐου 2011 - Αναθεώρηση: 4.0

Τρόπος χρήσης των διασυνδέσεων IComparable και IComparer στο Visual C#

Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.

Σε αυτήν τη σελίδα

Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Αυτό το άρθρο περιγράφει τη χρήση δύο διασυνδέσεις: 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.
  1. Στη Visual C#, δημιουργήστε ένα νέο έργο εφαρμογής κονσόλας. Το όνομα της εφαρμογής ConsoleEnum.
  2. Μετονομασία 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();
          }
       }
    }
    					
  3. Προσθήκη μιας κλάσης στο έργο. Το όνομα της κλάσης αυτοκίνητο.
  4. Αντικατάσταση κώδικα 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();
          }
    
       }
    }
    					
  5. Εκτέλεση του έργου. Στο παράθυρο κονσόλας εμφανίζεται το ακόλουθο αποτέλεσμα:
    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
    					

Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
Λέξεις-κλειδιά: 
kbsweptvs2008 kbhowtomaster kbmt KB320727 KbMtel
Μηχανικά μεταφρασμένοΜηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:320727  (http://support.microsoft.com/kb/320727/en-us/ )