Bu adım adım makalede, iki arabirim kullanımı anlatılmaktadır:
IComparer ve
ıcomparable. Bu arabirimler, iki nedenden aynı makalesinde ele alınmıştır. Bu arabirimler sık birlikte kullanılır ve arabirimlerin benzer (ve benzer adlara sahip), ancak bunlar farklı amaçlara hizmet eder.
Bir dizi
IComparer destekleyen türleri (örneğin,
dize veya
tamsay?) varsa, tüm açık
IComparer başvurusu girmeden bu dizi sıralayabilirsiniz. Bu durumda, dizi öğelerinin
IComparer (
Comparer.Default) varsayılan uygulanması için atama. Ancak özel nesneleriniz için sıralama ve karşılaştırma olanağı sağlamak, ya da ikisinden bu arabirimlerden birini uygulaması gerekir.
Bu makalede, aşağıdaki .NET Framework sınıf kitaplığı ad alanına başvurulmaktadır:
System.Collections
Icomparable
Icomparable rolünü, belirli bir türdeki iki nesne'i karşılaştırmanın bir yöntemidir sağlamaktır. Bu işlem, nesne için herhangi bir sipariş verme yeteneği sağlamak istiyorsanız gereklidir.
ıcomparable nesneleriniz için varsayılan bir sıralama düzeni sağlayan olarak düşünün. Örneğin, türünüzü nesnelerinin bir dizisi olan ve bu dizi üzerinde
sıralama yöntemini çağırmak,
ıcomparable nesnelerin Karşılaştırma sırasında sıralama sağlar. Aşağıdaki şekilde
ıcomparable arabirimini uygulayan,
CompareTo yöntemi uygulamalıdır:
// 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öntemi Karşılaştırmada karşılaştırılan değer veri türüne bağlı olarak farklıdır.
String.Compare bu örnekte, bir dize karşılaştırma için seçtiğiniz özelliği olduğu için kullanılır.
IComparer
IComparer rolünü ek karşılaştırma düzenekleri sağlamaktır. Örneğin, birkaç alanlarını veya özelliklerini sınıfınızın sipariş sağlamak artan ve azalan aynı alan veya her ikisini de isteyebilirsiniz.
IComparer kullanarak iki adımlı bir işlemdir. Ilk
IComparer uygulayan bir sınıf bildirmek ve daha sonra
karşılaştırma yöntemi uygulamak:
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 karşılaştırma. 1, 0 ya da -1 gerektiren bir değer büyük, eşit veya küçük diğerinden olup olmadığına bağımlı olarak döndürülür. Sıralama düzenini (artan veya azalan) mantıksal işleçlerle bu yöntemde geçiş yaparak değiştirilebilir.
Ikinci adım, bilgisayarınızın
IComparer nesnesinin bir kopyas?n? döndüren bir yöntem bildirmektir:
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
bu örnekte, ikinci bağımsız değişken yüklenmiş
Array.Sort yöntemini çağırdığınızda
IComparer kabul nesne kullanılır. Dizilerinin kullanımını
IComparer sınırlandırılmamıştır. Bir bağımsız değişken bir dizi farklı tahsilat ve Denetim sınıfları olarak kabul edilir.
Adım adım örnek
Aşağıdaki örnekte, bu arabirimler kullanımını gösterir.
IComparer ve
ıcomparable göstermek için <a0></a0>,
araba adında bir sınıf oluşturulur.
Araba nesnesi
ve Yıl özellikleri vardır. Artan bir sıralama alanı
yapmak için etkin
ıcomparable arabirimini ve
olun azalan bir sıralama alanı
IComparer arabiriminden etkin. Artan hem sıralar azalan,
IComparer <a2>
Yıl</a2> özelliği için sağlanır.
- Visual C# ile yeni bir konsol uygulaması) projesi oluşturun. ConsoleEnum uygulamanın adı.
- Program.cs Host.cs olarak yeniden adlandırın ve sonra bu kodu aşağıdaki kodla değiştirin.
Not Visual Studio .NET 2003'te Class1.cs Host.cs olarak yeniden adlandırın.
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();
}
}
}
- Bir sınıf projeye ekleyin. Araba sınıfı adı.
- Car.cs kodu aşağıdaki ile Değiştir:
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();
}
}
}
- Projeyi çalıştırın. Konsol penceresinde aşağıdaki çıktıyı 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