VB.NET - Usando Coleções do tipo List(Of T)


 No artigo de hoje eu vou mostrar como podemos usar os recursos da classe List(Of T) do namespace System.Collections.Generics.


Uma das classes introduzidas pelo namespace System.Collections.Generics é a classe List(of T) que é uma coleção genérica fortemente tipada tendo assim disponível o recurso intelissense e a verificação em tempo de compilação, o que evita muitos erros e facilita a vida do desenvolvedor.

Como qualquer classe (não estática) normal, para usar um objeto List, primeiro você deve declarar uma variável para ele: 


Dim nomeVariavel As New List(Of NomeTipo)()

 

Onde NomeTipo é o tipo para o qual a sua coleção esta sendo construída, e pode usar tipos por valor, como int e char, ou tipos por referência, como strings dentre outros tipos:

 


        Dim numeros As New List(Of Integer)()
        Dim caracteres As New List(Of Char)()
        Dim nomes As New List(Of String)()

 

Se a lista for construída de objetos você deve especificá-los:
 


      Dim eventos As New List(Of EventArgs)()
      Dim enumerations As New List(Of [Enum])()
      Dim exceptions As New List(Of Exception)()


Ou você pode criar o seu próprio tipo como por exemplo uma classe Pessoa() com 4 propriedades e um construtor:

 

Public Class Pessoa
    Public Property Id() As Integer
    Public Property Nome As String
    Public Property Idade() As Short
    Public Property Sexo As Nullable(Of Char)
    Public Sub New(ByVal _id As Integer, ByVal _nome As String, ByVal _idade As Short, ByVal _sexo As Char)
        Me.Id = _Id
        Me.Nome = _nome
        Me.Idade = _idade
        Me.Sexo = _sexo
    End Sub
End Class

 

Para definir a lista do tipo do seu objeto use o seguinte código:

 

 Dim listaPessoas As New List(Of Pessoa)()

 listaPessoas.Add(New Pessoa(1, "Jose Carlos Macoratti", 45, "M"c))
 listaPessoas.Add(New Pessoa(2, "Jefferson Santos", 19, "M"c))
 listaPessoas.Add(New Pessoa(3, "Miriam Ferreira", 25, "F"c))
 listaPessoas.Add(New Pessoa(4, "Janice Lima", 18, "F"c))
 listaPessoas.Add(New Pessoa(5, "Jessica Benitez", 22, "M"c))

 

Lembrando que você pode fazer a mesma declaração usando o recurso do inicializador de coleção com a seguinte sintaxe:

 

Nota: Inicializadores de coleção fornecem uma sintaxe abreviada que permite que você crie uma coleção e preencha com um conjunto inicial de valores. Inicializadores de coleção são úteis quando você está criando uma coleção de um conjunto de valores conhecidos.

 

 Dim listaPessoas = New List(Of Pessoa) From
 {
           New Pessoa(1, "Jose Carlos Macoratti", 45, "M"c),
           New Pessoa(2, "Jefferson Santos", 19, "M"c),
           New Pessoa(3, "Miriam Ferreira", 25, "F"c),
           New Pessoa(4, "Janice Lima", 18, "F"c),
           New Pessoa(5, "Jessica Benitez", 22, "M"c)
 }

 

Acessando e exibindo uma lista tipada

 

Para acessar e exibir os valores de uma lista tipada podemos primeiro criar um método para retornar a lista:

 

Public Shared Function GetPessoas() As List(Of Pessoa)

        Dim listaPessoas = New List(Of Pessoa) From
        {
             New Pessoa(1, "Jose Carlos Macoratti", 45, "M"c),
             New Pessoa(2, "Jefferson Santos", 19, "M"c),
             New Pessoa(3, "Miriam Ferreira", 25, "F"c),
             New Pessoa(4, "Janice Lima", 18, "F"c),
             New Pessoa(5, "Jessica Benitez", 22, "M"c)
         }

        Return listaPessoas

End Function

 

Assim o método GetPessoas() retorna uma lista do tipo Pessoas().

 

Para facilitar o nosso trabalho podemos sobrescrever o método ToString() de forma a exibir os dados de uma pessoa:

 

 Public Overrides Function ToString() As String
        MyBase.ToString()

        Return String.Format("------------------------" & vbLf +
                                     "Dados da  Pessoa" & vbLf +
                                     "------------------------" & vbLf +
                                     "Pessoa #:    {0}" & vbLf & "Nome : {1}" & vbLf +
                                     "Idade   :    {2}" & vbLf & "Sexo : {3}", Id, Nome, Idade, Sexo)
    End Function

 

No código acima sobrescrevemos (Overrides) o método ToString() em nossa classe Pessoa() para exibir os dados de uma pessoa.

 

Agora obtendo a lista podemos percorrer a lista das seguintes formas:

 

1- Usando o laço For/Next

 

Sub Main()
  Dim lista = Pessoa.GetPessoas()
  For i As Integer = 0 To lista.Count - 1
            Console.WriteLine(lista(i))
  Next
 Console.ReadKey()
End Sub

 

2- Usando o laço For/Each

 

Sub Main()
  Dim lista = Pessoa.GetPessoas()
  For Each p As Pessoa In lista
        Console.WriteLine(p)
  Next

  Console.ReadKey()
End Sub

 

3- Usando um delegate

 

    Sub Main()
        Dim lista = Pessoa.GetPessoas()
        lista.ForEach(AddressOf Imprimir)
        Console.ReadKey()
    End Sub
    Public Sub Imprimir(ByVal p As Pessoa)
        Console.WriteLine(p)
    End Sub

 

4- Usando um Expressões Lambadas (No VB .NET não funciona)

 

    Sub Main()
        Dim lista = Pessoa.GetPessoas()      
        lista.ForEach(Function(p) Console.WriteLine(" Id = {0}, Nome = {1} , Idade = {2} , Sexo = {3} ", p.Id, p.Nome, p.Idade, p.Sexo))
        Console.ReadKey()
    End Sub

O código acima utiliza uma expressão lambda para imprimir as pessoas mas no VB .NET o código apresenta a mensagem de erro: Expression does not produce value

Na linguagem C# o código funciona.

Dessa forma concluímos que as expressões lambdas no VB .NET devem retornar um valor o que não ocorre neste caso.

Encontrei uma solução neste artigo: Fixing a Quirk of VB Lambda Expressions

Procurando um item da lista tipada

 

Suponha que você deseja localizar um objeto do tipo pessoa na lista de pessoas. Você poderia usar o método Contains da lista tipada para verificar se um objeto esta na lista.

 

Nota: O método Contains determina se um elemento esta na Lista tipada


Então poderíamos supor que o código abaixo vai funcionar:

 

    Sub Main()
        Dim lista = Pessoa.GetPessoas()

        Dim desconhecido As New Pessoa(3, "Miriam Ferreira", 25, "F"c)
        Dim estaNalista As Boolean = lista.Contains(desconhecido)
        If estaNalista Then
            Console.WriteLine(" A lista de pessoa contém o desconhecido ")
        Else
            Console.WriteLine(" Esta pessoa não esta na lista ")
        End If
        Console.ReadKey()
    End Sub

 

Mas esse código não vai funcionar...

 

Para que o método funcione para um lista de objetos tipados devemos sobrescrever o método Equals() na classe Pessoa():

 

    Public Overrides Function Equals(obj As Object) As Boolean
        Dim p As Pessoa = DirectCast(obj, Pessoa)
        If (p.Id = Me.Id) AndAlso (p.Nome = Me.Nome) AndAlso (p.Idade = Me.Idade) AndAlso (p.Sexo = Me.Sexo) Then
            Return True
        Else
            Return False
        End If
    End Function

Após essa implementação onde sobrescrevemos o método Equals() o código vai funcionar corretamente.

Removendo itens da lista tipada

 

Existem diversas maneiras de remover um item em uma lista. Para deletar um item com base no seu índice podemos usar o método RemoveAt() cuja sintaxe é :

Public Sub RemoveAt(index As Integer)
End Sub
Vejamos um exemplo para remover um item da lista tipada com base em seu índice:
    Sub Main()
        Dim lista = Pessoa.GetPessoas()
        For Each p As Pessoa In lista
            Console.WriteLine(p)
        Next
        lista.RemoveAt(2)
        Console.WriteLine("O elemente de índice igual a 2 foi removido...")
        For Each p As Pessoa In lista
            Console.WriteLine(p)
        Next
        Console.ReadKey()
   End Sub

No nosso exemplo o primeiro elemento possui índice igual a zero, o segundo igual a 1 e assim por diante. O resultado obtido pelo código acima é:

Para obter o índice de um elemento você pode usar o método IndexOf().

Quando você chamar o método IndexOf (), o compilador compara cada membro da coleção com o valor passado como argumento.

Isso funciona com lista de tipos primitivos, porque eles têm embutido um comparador em suas estruturas. Se você quer que isso funcione em uma classe que você criou, você deve sobrescrever o método Equals().

Se você chamar a versão acima do método IndexOf(), o compilador iria procurar o item na lista inteira a partir do início, o índice 0.

Se você quiser, você pode pedir para compilador para começar a pesquisa a partir de uma posição específica.

Para fazer isso, use a seguinte versão do método IndexOf ():

Public Function IndexOf(item As T, index As Integer) As Integer
End Function
 

Para remover todos os itens da lista utilize o método Clear():

lista.Clear()

Convertendo uma lista para um Array

Para converter uma lista para um array você pode chamar o método ToArray() da classe List(Of T). A sintaxe é :

Public Function ToArray() As T()
End Function

Exemplo:

 Sub Main()
        Dim lista = Pessoa.GetPessoas()
        Dim pessoas As Pessoa() = lista.ToArray()
        For Each p As Pessoa In pessoas
            Console.WriteLine(p)
        Next
        Console.ReadKey()
    End Sub

Vimos assim alguns dos recursos e como podemos usar as coleções do tipo List(Of T) usando a linguagem VB .NET.

Não vos esqueçais da hospitalidade, porque por ela alguns, não o sabendo, hospedaram anjos.
Hebreus 13:2

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti