Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Utilizando Colecções List(Of T)

O namespace System.Collections.Generic contém um conjunto de interfaces e classes que permitem criar colecções muito seguras, simples de utilizar e com muitos bons performances. Estas colecções de Generics são do tipo strongly typed, ou seja, estão disponíveis no intelissense e verificadas pelo compilador, o que evita erros e torna mais fácil a vida ao programador.

   

Existem diversos tipos de colecções neste ou em outros namespaces (como por exemplo o Dictionary, SortedList, ArrayList, etc) mas um muito utilizado é o List(Of (T)), onde se define o tipo da colecção que se pretende.

   

Um exemplo simples de utilização:

   

        ' Cria uma nova lista do tipo "string"

        Dim lstEmpreg As New List(Of String)

   

        ' Adiciona alguns nomes à lista

        lstEmpreg.Add("João Paulo")

        lstEmpreg.Add("Pedro Sousa")

        lstEmpreg.Add("Luís Nascimento")

        lstEmpreg.Add("Carlos Sousa")

        lstEmpreg.Add("Nuno Luís")

   

        Dim nomePesquisar As String = "Pedro Sousa"

   

        ' Caso o nome a pesquisar seja encontrado

        If lstEmpreg.Contains(nomePesquisar) Then

   

            ' Mostra o nome e o total de nomes na lista

            Dim msg As String = "O nome {0} foi encontrado em {1} nome(s)"

            Debug.WriteLine(String.Format(msg, nomePesquisar, lstEmpreg.Count))

   

        Else

   

            ' Mensagem caso não encontre o nome na lista

            Debug.WriteLine("Nome não encontrado na lista!")

   

        End If

   

 

Mas esta colecção pode ser muito mais complexa, sendo necessário guardar vários dados (para além do nome), como por exemplo o número, idade, telefone, etc. Neste caso será criada uma estrutura e guardada na lista.

   

O método de pesquisa implementa um IEquatable e utiliza um Predicate. Desta forma não é necessário percorrer todos os items da lista para verificar qual o item correspondente.

   

Um exemplo de utilização

Construção de uma classe simples, sem utilização de  propriedades (get/set), que implementa o IEquatable (apenas para demonstração):

   

Exemplo:

   

' Construção de uma classe simples, sem utilização de

‘ propriedades (get/set) que implementa o IEquatable

Public Class Empregado

    Implements IEquatable(Of Empregado)

   

    ' Campos da classe

    Public ID As Byte

    Public Nome As String

    Public Idade As Byte

   

    Public Function ProcuraEmpregado(ByVal EmpID As Empregado) _

        As Boolean Implements System.IEquatable(Of Empregado).Equals

        ' Retorna o ID mas poderá ser utilizado outro campo

        ' para pesquisa, sendo apenas necessário altera para

        ' o campo correctos (ex. Me.Nome = EmpID.Nome)

        Return Me.ID = EmpID.ID

    End Function

   

End Class

   

   

Utilização da List(Of T) que neste caso adiciona alguns empregados e pesquisa por um campo mostrando os resultados. O campo escolhido para o exemplo foi o ID mas pode-se pesquisar por qualquer campo.

   

   

        ' Cria uma nova lista do tipo "Empregado"

        Dim lstEmpregados As New List(Of Empregado)

   

        ' Adiciona empregados à lista

        Dim Emp1 As New Empregado

        Emp1.ID = 1

        Emp1.Nome = "João Paulo"

        Emp1.Idade = 28

        lstEmpregados.Add(Emp1)

   

        Dim Emp2 As New Empregado

        Emp2.ID = 2

        Emp2.Nome = "Pedro Sousa"

        Emp2.Idade = 25

        lstEmpregados.Add(Emp2)

   

        Dim Emp3 As New Empregado

        Emp3.ID = 3

        Emp3.Nome = "Luís Nascimento"

        Emp3.Idade = 41

        lstEmpregados.Add(Emp3)

   

        ' Empregado a procurar na lista

        Dim Emp As New Empregado

        Emp.ID = 2

   

        ' Guarda o resultado da procura na variável EmpResult

        Dim EmpResult As Empregado

   

        ' Pesquisa na lista de empregados usando um Predicate do tipo empregado

        EmpResult = lstEmpregados.Find(New System.Predicate(Of Empregado)(AddressOf Emp.ProcuraEmpregado))

   

        ' Caso tenha encontrado mostra os resultados ou a mensagem de erro

        If EmpResult IsNot Nothing Then

            Debug.WriteLine("Número: " & EmpResult.ID.ToString)

            Debug.WriteLine("Empregado: " & EmpResult.Nome.ToString)

            Debug.WriteLine("Idade: " & EmpResult.Idade.ToString)

        Else

            Debug.WriteLine("Número de empregado não encontrado")

        End If

   

 

 

Resultado:

 

Número: 2

Empregado: Pedro Sousa

Idade: 25

 

 

As colecções foram completamente revolucionadas com a versão .NET e a sua utilização vem melhorar o que, no passado com o VB6, se fazia apenas com as Collections (muito limitadas) ou com a utilização de arrays.

   

São bastante simples de utilizar e é recomendável que se verifique qual a colecção que mais se adequa às necessidades no programa.

   

   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

5 comentários:

Filipe disse...

Nunca usei mas parece fácil.

Visita --> http://filipemm.wordpress.com/

Fábio Domingos disse...

Em Java, uso isso bastantes vezes, não haja qualquer dúvida que é bastante útil!

Fábio Domingos

Rafael Segat disse...

Mui útil. Obrigado

Renan Azevedo disse...

Muito útil!
Porém, estou tentando utilizar essa ferramenta para fazer cálculos estatísticos com valores declarados em textbox, por exemplo, do textbox1 ao textbox7 e não tem dado certo. É possível?

Não consigo desenvolver além desta etapa:

Imports System
Imports System.Collections.Generic
Imports System.Math

Public Class frmParametros

Private _average As String

Private Property Average(ByVal list As List(Of ponto1)) As String
Get
Return _average
End Get
Set(ByVal value As String)
_average = value
End Set
End Property

Private Sub frmParametros_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim ponto1 As New List(Of Decimal)

ponto1.Add(txtP1R1.Text)
ponto1.Add(txtP1R2.Text)
ponto1.Add(txtP1R3.Text)
ponto1.Add(txtP1R4.Text)
ponto1.Add(txtP1R5.Text)
ponto1.Add(txtP1R6.Text)
ponto1.Add(txtP1R7.Text)
End Sub
Private Sub btnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcular.Click
txtMediaP1.Text = Average(List(Of Decimal).ponto1))

End Sub

To no caminho certo?
Desde já agradeço....

Jorge Paulino disse...

Pode colocar a questão no fórum www.portugal-a-programar.pt ?

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico