汎用ソート

9607 ワード

ASP.NET 2.0汎用
IComparerとIComparableの2つのインタフェースの使用について説明します.これらのインタフェースは同じ文章で2つの原因が議論されている.これらのインタフェースは、よく一緒に使用され、インタフェースが類似している(類似の名前を持っている)にもかかわらず、用途が異なる.文字列や整数などの配列タイプがIComparerをサポートしている場合は、IComparerソート配列に明示的な参照を提供しなくてもよい.この場合、配列の要素はIComparer(Comparer.Default)のデフォルトの実装に変換されます.ただし、カスタムオブジェクトのソートまたは比較機能を提供するには、1つまたは2つのインタフェースを実装する必要があります.本文では以下を引用する.NET Frameworkクラスライブラリネーミングスペース:
System.Collections
 
 

IComparable



loadTOCNode(2, 'summary');
IComparableの役割は、特定のタイプの2つのオブジェクトを比較する方法です.これは、オブジェクトにソート機能を提供する場合に必要です.IComparableは、オブジェクトのデフォルトのソート順序を提供しているとみなされます.たとえば、タイプのオブジェクトの配列があり、その配列にSortメソッドが呼び出されている場合、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);

}
				
メソッドのプログラム比較は,比較中の値のデータ型depending onが異なる.比較用に選択する属性は文字列であるため、この例ではStringを用いる.Compare .
 

IComparer



loadTOCNode(2, 'summary');
IComparerの役割は他の比較メカニズムを提供することである.たとえば、複数のフィールドまたは属性、クラスの昇順と降順が同じフィールドまたは両方の順序を指定することができます.IComparerを使用するのは2つのステップです.まず、実装IComparer、クラスを宣言し、次に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;
   }
}
				
値が大きいか、等しいか、または小さいかによってIComparerが戻る.Compareメソッドには、3番目の比較1、0または-1の説明が必要です.論理演算子を切り替えることで、ソート順(昇順または降順)を変更できます.2つ目のステップは、IComparerオブジェクトのインスタンスを返す方法を宣言します.
public static IComparer sortYearAscending()
{      
   return (IComparer) new sortYearAscendingHelper();
}
				
この例では、オブジェクトは、2番目のパラメータのリロードの次のメソッドを呼び出すときにIComparerを受け入れるために使用されます.IComparerの使用は配列の使用に限定されません.パラメータとして多くの異なるセットとコントロールクラスで受け入れられます.
 

ステップの例



loadTOCNode(2, 'summary');
次の例では、これらのインタフェースの使用を示します.IComparerとIComparableを説明するために、自動車というクラスを作成します.車のオブジェクトには使用と年属性があります.昇順ソートIComparableインタフェースと降順ソートを使用可能にするには、IComparerインタフェースを使用可能にするには、ドメインを使用可能にします.IComparerによる使用年度属性の昇順および降順ソートを提供します.
  • Visual C#で、新しいコンソールアプリケーションプロジェクトを作成します.アプリケーションConsoleEnumの名前.
  • はhostと名前を変更した.cs,Program.cs、そしてコードを次のコードに置き換えます.Visual Studio Nでhostと名前を変更することに注意してください.csのClass 1.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
    "); 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("
    Array - Sorted by Make (Ascending - IComparable)
    "); 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("
    Array - Sorted by Year (Ascending - IComparer)
    "); 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("
    Array - Sorted by Make (Descending - IComparer)
    "); 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("
    Array - Sorted by Year (Descending - IComparer)
    "); 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
    					
  •