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:
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. 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB .NET - Realizando operações com List(of T) - Macoratti.net