Como usar o IComparable e as interfaces de IComparer no Visual Basic .NET ou no Visual Basic 2005

IMPORTANTE: 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: 321292
Este artigo se refere ao seguinte Microsoft .NET Framework Class Library namespace:
  • System.Collections

NESTA TAREFA

Sumário
Este artigo passo a passo demonstra como usar duas interfaces: IComparer e IComparable . Essas interfaces são abordadas no mesmo artigo por dois motivos:
  • Essas interfaces são usadas em conjunto com freqüência.
  • Embora as interfaces são semelhantes (e tenham nomes semelhantes), os objetivos que eles servem são um pouco diferentes.
Se você tiver uma matriz de tipos (como a seqüência de caracteres ou os tipos de número inteiro ) 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 deseja classificar e para comparar os objetos personalizados, você deve implementar uma ou ambas essas interfaces.

back to the top

Interface IComparable

A interface IComparable fornece um método para comparar dois objetos de um tipo específico. Use esta interface se você desejar solicitar 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 se você chamar o método Sort nessa matriz, você pode usar a interface IComparable para comparar os objetos durante a classificação. Quando você implementa a interface IComparable , você também deve implementar o método CompareTo . Por exemplo:
Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo   Dim c As car = CType(obj, car)   Return String.Compare(Me.mmake, c.mmake)End Function				
a comparação no método difere dependendo o tipo de dados do valor que está sendo comparado. Este exemplo usa o método String.Compare porque a propriedade que está sendo comparada é uma seqüência de caracteres.

back to the top

IComparer interface

A interface IComparer fornece mecanismos de comparação adicionais. Por exemplo, convém solicitar sua classe em vários campos ou propriedades, por ordem crescente ou decrescente no mesmo campo ou em ambos.

Para usar IComparer , execute estas etapas:
  1. Declarar uma classe que implementa IComparer e implementar o método Compare . Por exemplo:
    Private Class sortYearDescendingHelper : Implements IComparer   Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements IComparer.Compare      Dim c1 As car = CType(a, car)      Dim c2 As car = CType(b, car)      If (c1.year < c2.year) Then         Return 1      End If      If (c1.Year > c2.Year) Then         Return -1      Else         Return 0      End If   End FunctionEnd Class						
    aviso que o método IComparer.Compare requer comparação terciário. 1, 0 ou-1 é retornado, dependendo se um valor for maior que, igual ou menor que o outro.

    Observação : você pode mudar a ordem de classificação (crescente ou decrescente), alternando os operadores lógicos neste método.
  2. Declara um método que retorna uma instância do seu objeto IComparer . Este exemplo usa o objeto como o segundo argumento ao chamar o método Array.Sort sobrecarregado que aceita IComparer .
    Public Shared Function sortYearAscending() As IComparer   Return CType(New sortYearAscendingHelper(), IComparer)End Function					
O uso de IComparer não é limitado a matrizes, ele é aceito como um argumento em um número de diferentes classes de coleção e controle.

back to the top

Exemplo passo a passo

O exemplo nesta seção demonstra como usar IComparer e IComparable . Este exemplo cria uma classe chamada carro . O objeto de carro tem duas propriedades: faça e ano . Este exemplo usa a interface IComparable para classificar a criar campo em ordem crescente. Este exemplo, em seguida, usa a interface IComparer para classificar a criar campo em ordem decrescente. Este exemplo também fornece crescente e decrescente Classifica para a propriedade ano através do uso de IComparer .
  1. Inicie o Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Clique em Projetos do Visual Basic em Project Types , clique em Aplicativo de console em modelos e digite ConsoleEnum na caixa nome .

    Observação No Visual Basic 2005, clique em Visual Basic em Project Types .
  4. No Solution Explorer, clique com o botão direito do mouse Module1.vb , clique em Renomear e, em seguida, digite Host.vb .
  5. Substitua o código no Host.vb com o seguinte código:
    Module Module1   Sub Main()      Dim c As car      Dim arrayOfCars() As car = _         { _         New car("Ford", 1992), _         New car("Fiat", 1988), _         New car("Buick", 1932), _         New car("Ford", 1932), _         New car("Dodge", 1999), _         New car("Honda", 1977) _         }      Dim t As String = vbTab & vbTab      Dim n As String = vbCrLf      Console.WriteLine("Array - Unsorted" & n)      For Each c In arrayOfCars         Console.WriteLine(c.Make & t & c.Year)      Next      Array.Sort(arrayOfCars)      Console.WriteLine(n & "Array - Sorted by Make (Ascending - IComparable)" & n)      For Each c In arrayOfCars         Console.WriteLine(c.Make & t & c.Year)      Next      Array.Sort(arrayOfCars, car.sortYearAscending())      Console.WriteLine(n & "Array - Sorted by Year (Ascending - IComparer)" & n)      For Each c In arrayOfCars         Console.WriteLine(c.Make & t & c.Year)      Next      Array.Sort(arrayOfCars, car.sortMakeDescending())      Console.WriteLine(n & "Array - Sorted by Make (Descending - IComparer)" & n)      For Each c In arrayOfCars         Console.WriteLine(c.Make & t & c.Year)      Next      Array.Sort(arrayOfCars, car.sortYearDescending())      Console.WriteLine(n & "Array - Sorted by Year (Descending - IComparer)" & n)      For Each c In arrayOfCars         Console.WriteLine(c.Make & t & c.Year)      Next      Console.ReadLine()   End SubEnd Module					
  6. No menu Project , clique em Add Class .
  7. Na caixa de diálogo Add New Item , digite carro na caixa nome e em seguida, clique em Abrir .

    Observação No Visual Studio 2005, clique em Adicionar em vez de Abrir .
  8. Substitua o código no car.vb com o seguinte código:
    Option Explicit On Option Strict OnImports System.CollectionsPublic Class car : Implements IComparable   ' Nested classes to do secondary sorts   Private Class sortYearAscendingHelper : Implements IComparer      Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements IComparer.Compare         Dim c1 As car = CType(a, car)         Dim c2 As car = CType(b, car)         If (c1.year > c2.year) Then            Return 1         End If         If (c1.Year < c2.Year) Then            Return -1         Else            Return 0         End If      End Function   End Class   Private Class sortYearDescendingHelper : Implements IComparer      Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements IComparer.Compare         Dim c1 As car = CType(a, car)         Dim c2 As car = CType(b, car)         If (c1.year < c2.year) Then            Return 1         End If         If (c1.Year > c2.Year) Then            Return -1         Else            Return 0         End If      End Function   End Class   Private Class sortMakeDescendingHelper : Implements IComparer      Function Compare(ByVal a As Object, ByVal b As Object) As Integer Implements IComparer.Compare         Dim c1 As car = CType(a, car)         Dim c2 As car = CType(b, car)         Return String.Compare(c2.Make, c1.Make)      End Function   End Class   ' End nested classes.   Private myear As Integer   Private mmake As String   Public Sub New(ByVal Make As String, ByVal Year As Integer)      mmake = Make      myear = Year   End Sub   Public Property Year() As Integer      Get         Return myear      End Get      Set(ByVal Value As Integer)         myear = Value      End Set   End Property   Public Property Make() As String      Get         Return mmake      End Get        Set(ByVal Value As String)         mmake = Value      End Set    End Property    Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo       Dim c As car = CType(obj, car)       Return String.Compare(Me.mmake, c.mmake)    End Function    Public Shared Function sortYearAscending() As IComparer       Return CType(New sortYearAscendingHelper(), IComparer)    End Function    Public Shared Function sortYearDescending() As IComparer       Return CType(New sortYearDescendingHelper(), IComparer)    End Function    Public Shared Function sortMakeDescending() As IComparer       Return CType(New sortMakeDescendingHelper(), IComparer)    End FunctionEnd Class					
  9. Execute o projeto. Observe que a saída a seguir é exibida na janela do console:
    Array - UnsortedFord            1992Fiat            1988Buick           1932Ford            1932Dodge           1999Honda           1977Array - Sorted by Make (Ascending - IComparable)Buick           1932Dodge           1999Fiat            1988Ford            1932Ford            1992Honda           1977Array - Sorted by Year (Ascending - IComparer)Ford            1932Buick           1932Honda           1977Fiat            1988Ford            1992Dodge           1999Array - Sorted by Make (Descending - IComparer)Honda           1977Ford            1932Ford            1992Fiat            1988Dodge           1999Buick           1932Array - Sorted by Year (Descending - IComparer)Dodge           1999Ford            1992Fiat            1988Honda           1977Buick           1932Ford            1932						
back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 321292 - Última Revisão: 12/06/2006 23:18:59 - Revisão: 2.4

Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic 2005

  • kbmt kbvs2005applies kbvs2005swept kbhowtomaster KB321292 KbMtpt
Comentários