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:
Nunca usei mas parece fácil.
Visita --> http://filipemm.wordpress.com/
Em Java, uso isso bastantes vezes, não haja qualquer dúvida que é bastante útil!
Fábio Domingos
Mui útil. Obrigado
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....
Pode colocar a questão no fórum www.portugal-a-programar.pt ?
Enviar um comentário