汎用ソート
9607 ワード
ASP.NET 2.0汎用
IComparerとIComparableの2つのインタフェースの使用について説明します.これらのインタフェースは同じ文章で2つの原因が議論されている.これらのインタフェースは、よく一緒に使用され、インタフェースが類似している(類似の名前を持っている)にもかかわらず、用途が異なる.文字列や整数などの配列タイプがIComparerをサポートしている場合は、IComparerソート配列に明示的な参照を提供しなくてもよい.この場合、配列の要素はIComparer(Comparer.Default)のデフォルトの実装に変換されます.ただし、カスタムオブジェクトのソートまたは比較機能を提供するには、1つまたは2つのインタフェースを実装する必要があります.本文では以下を引用する.NET Frameworkクラスライブラリネーミングスペース:
System.Collections
loadTOCNode(2, 'summary');
IComparableの役割は、特定のタイプの2つのオブジェクトを比較する方法です.これは、オブジェクトにソート機能を提供する場合に必要です.IComparableは、オブジェクトのデフォルトのソート順序を提供しているとみなされます.たとえば、タイプのオブジェクトの配列があり、その配列にSortメソッドが呼び出されている場合、IComparableソート中にオブジェクトの比較結果が表示されます.IComparableインタフェースを実装する場合は、次のようにCompareToメソッドを実装する必要があります.
loadTOCNode(2, 'summary');
IComparerの役割は他の比較メカニズムを提供することである.たとえば、複数のフィールドまたは属性、クラスの昇順と降順が同じフィールドまたは両方の順序を指定することができます.IComparerを使用するのは2つのステップです.まず、実装IComparer、クラスを宣言し、次にCompareメソッドを実装します.
loadTOCNode(2, 'summary');
次の例では、これらのインタフェースの使用を示します.IComparerとIComparableを説明するために、自動車というクラスを作成します.車のオブジェクトには使用と年属性があります.昇順ソートIComparableインタフェースと降順ソートを使用可能にするには、IComparerインタフェースを使用可能にするには、ドメインを使用可能にします.IComparerによる使用年度属性の昇順および降順ソートを提供します. Visual C#で、新しいコンソールアプリケーションプロジェクトを作成します.アプリケーションConsoleEnumの名前. はhostと名前を変更した.cs,Program.cs、そしてコードを次のコードに置き換えます.Visual Studio Nでhostと名前を変更することに注意してください.csのClass 1.cs クラスをプロジェクトに追加します.ネーミングカー. はCarにあります.csコードを次のように置き換えます. プロジェクトを実行します.次の出力は、コンソールウィンドウに表示されます.
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による使用年度属性の昇順および降順ソートを提供します.
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();
}
}
}
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