Este artigo passo a passo descreve o uso de duas interfaces:
IComparer e
IComparable . Essas interfaces são discutidas em mesmo artigo por dois motivos. Essas interfaces com freqüência são usadas juntos, e embora as interfaces são semelhantes (e tenham nomes semelhantes), eles servem a finalidades diferentes.
Se você tiver uma matriz de tipos (como
string ou
integer ) que já oferecem suporte a
IComparer , você pode classificar essa matriz sem fornecer qualquer referência explícita à
IComparer . Nesse caso, os elementos da matriz são converter para a implementação padrão de
IComparer (
Comparer.Default ) para você. No entanto, se você desejar fornecer capacidade de classificação ou comparação para os objetos personalizados, você deve implementar uma ou ambas essas interfaces.
O namespace do .NET Framework Class Library seguinte é mencionado neste artigo:
System.Collections
IComparable
A função de
IComparable é fornecer um método de comparação de dois objetos de um tipo específico. Isso é necessário se você desejar fornecer qualquer recurso pedido para seu objeto. Pense
IComparable como fornecer uma ordem de classificação padrão para os objetos. Por exemplo, se você tiver uma matriz de objetos do seu tipo, e você chamar o método
Sort nessa matriz,
IComparable fornecerá a comparação de objetos durante a classificação. Quando você implementa a interface
IComparable , você deve implementar o método
CompareTo , da seguinte maneira:
// Implement IComparable CompareTo method - provide default sort order.
int IComparable.CompareTo(object obj)
{
car c=(car)obj;
return String.Compare(this.make,c.make);
}
a comparação no método é diferente dependendo do tipo dados do valor que está sendo comparado.
String.Compare é usado neste exemplo porque a propriedade que é escolhida para a comparação é uma seqüência de caracteres.
IComparer
A função de
IComparer é fornecer mecanismos de comparação adicionais. Por exemplo, convém fornecer a ordem de sua classe em vários campos ou propriedades, ordem crescente ou decrescente no mesmo campo ou em ambos.
Usar
IComparer é um processo de duas etapas. Primeiro, declara uma classe que implementa
IComparer e, em seguida, implementar o método
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;
}
}
Observação que o método
IComparer.Compare requer comparação terciário. 1, 0 ou-1 é retornada dependendo se um valor for maior que, igual ou menor que o outro. Pode ser alterado a ordem de classificação (crescente ou decrescente), alternando os operadores lógicos neste método.
A segunda etapa é declarar um método que retorna uma instância do seu objeto
IComparer :
public static IComparer sortYearAscending()
{
return (IComparer) new sortYearAscendingHelper();
}
neste exemplo, o objeto é usado como o segundo argumento ao chamar o método
Array.Sort sobrecarregado que aceita
IComparer . O uso de
IComparer não é limitado a matrizes. Ele é aceito como um argumento em um número de coleção diferente e classes de controle.
Exemplo passo a passo
O exemplo a seguir demonstra o uso dessas interfaces. Para demonstrar
IComparer e
IComparable , uma classe chamada
carro é criada. O objeto de
carro tem as propriedades de
fazer e
ano . Uma classificação crescente para
fazer o campo está ativado por meio de interface
IComparable e uma classificação decrescente em
que campo será habilitado por meio da interface
IComparer . Tanto crescente e decrescente Classifica são fornecidos para a propriedade
ano através do uso de
IComparer .
- No Visual translation from VPE for Csharp, crie um novo projeto Console Application. Nome do aplicativo ConsoleEnum.
- Renomeie Program.cs como Host.cs e substitua o código com o código a seguir.
Observação No Visual Studio .NET 2003, renomeie Class1.cs como 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();
}
}
}
- Adicione uma classe para o projeto. Nome da classe carro .
- Substitua o código no Car.cs com o seguinte:
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();
}
}
}
- Execute o projeto. A seguinte saída aparecerá na janela Console:
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
ID do artigo: 320727 - Última revisão: quarta-feira, 30 de julho de 2008 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
- Microsoft Visual C# 2008 Express Edition
- Microsoft Visual C# 2005 Express Edition
| kbmt kbsweptvs2008 kbhowtomaster KB320727 KbMtpt |
Tradução automáticaIMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo:
320727
(http://support.microsoft.com/kb/320727/en-us/
)