IComparable Visual CSharp'ta ve IComparer arabirimlerini kullanma

Bu makalede Visual C# içinde ve IComparable arabirimlerinin kullanımı IComparer açıklanmaktadır.

Orijinal ürün sürümü: Visual C#
Özgün KB numarası: 320727

Özet

IComparable ve IComparer arabirimleri aynı makalede iki nedenden dolayı ele alınmaktadır. Bu arabirimler sık sık birlikte kullanılır. Arabirimler benzer ve benzer adlara sahip olsa da, farklı amaçlara hizmet eder.

zaten destekleyen IComparerbir tür diziniz (dize veya tamsayı gibi) varsa, bu diziyi öğesine ICompareraçık bir başvuru sağlamadan sıralayabilirsiniz. Bu durumda, dizinin öğeleri sizin için varsayılan uygulamasına IComparer (Comparer.Default) döndürülür. Ancak, özel nesneleriniz için sıralama veya karşılaştırma özelliği sağlamak istiyorsanız, bu arabirimlerden birini veya her ikisini de uygulamanız gerekir.

Bu makale, Microsoft .NET Framework Sınıf Kitaplığı ad alanına System.Collectionsbaşvurur.

IComparable

rolü IComparable , belirli bir türdeki iki nesneyi karşılaştırmak için bir yöntem sağlamaktır. Nesneniz için herhangi bir sıralama özelliği sağlamak istiyorsanız bu gereklidir. IComparable Nesneleriniz için varsayılan bir sıralama düzeni sağlamak olarak düşünün. Örneğin, türündeki bir nesne diziniz varsa ve bu dizide Sort yöntemini çağırırsanız, IComparable sıralama sırasında nesnelerin karşılaştırmasını sağlar. Arabirimini uyguladığınızda IComparable yöntemini aşağıdaki gibi uygulamanız CompareTo gerekir:

// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
   Car c=(Car)obj;
   return String.Compare(this.make,c.make);
}

yöntemindeki karşılaştırma, karşılaştırılmakta olan değerin veri türüne bağlı olarak farklıdır. String.Compare bu örnekte kullanılır çünkü karşılaştırma için seçilen özellik bir dizedir.

IComparer

rolü IComparer , daha fazla karşılaştırma mekanizması sağlamaktır. Örneğin, sınıfınızın sıralamasını birkaç alan veya özellikte, aynı alanda artan ve azalan düzende ya da her ikisinde de sağlamak isteyebilirsiniz.

kullanmak IComparer iki adımlı bir işlemdir. İlk olarak, uygulayan IComparerbir sınıf bildirin ve ardından yöntemini uygulayın Compare :

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;
   }
}

Not

IComparer.Compare yöntemi üçüncül bir karşılaştırma gerektirir. 1, 0 veya -1 , bir değerin diğerinden büyük, buna eşit veya daha küçük olmasına bağlı olarak döndürülür. Sıralama düzeni (artan veya azalan) bu yöntemdeki mantıksal işleçler değiştirilerek değiştirilebilir.

İkinci adım, nesnenizin IComparer bir örneğini döndüren bir yöntem bildirmektir:

public static IComparer SortYearAscending()
{
   return (IComparer) new SortYearAscendingHelper();
}

Bu örnekte, nesnesini kabul IComparereden aşırı yüklenmiş Array.Sort yöntemi çağırdığınızda ikinci bağımsız değişken olarak kullanılır. kullanımı IComparer dizilerle sınırlı değildir. Birçok farklı koleksiyon ve denetim sınıfında bağımsız değişken olarak kabul edilir.

Adım adım örnek

Aşağıdaki örnekte bu arabirimlerin kullanımı gösterilmektedir. ve IComparablegöstermek IComparer için adlı Car bir sınıf oluşturulur. Car nesnesi, make ve year özelliklerine sahiptir. Oluşturma alanı için artan sıralama arabirim aracılığıyla IComparable etkinleştirilir ve oluşturma alanında azalan sıralama arabirim aracılığıyla IComparer etkinleştirilir. kullanılarak year özelliği ICompareriçin hem artan hem de azalan sıralamalar sağlanır.

  1. Visual C# içinde yeni bir Konsol Uygulaması projesi oluşturun. Uygulamaya ConsoleEnum adını verin.

  2. Program.csHost.cs olarak yeniden adlandırın ve kodu aşağıdaki kodla değiştirin.

    using System;
    
    namespace ConsoleEnum
    {
        class host
        {
           [STAThread]
           static void Main(string[] args)
           {
              // Create an array 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. Projeye bir sınıf ekleyin. Sınıfa Araba adını verin.

  4. Car.cs içindeki kodu aşağıdaki kodla değiştirin:

    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. Projeyi çalıştırın. Konsol penceresinde aşağıdaki çıkış görüntülenir:

    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