Desenvolvimento - C#
Trabalhando com HashTable – WinForms – C#
Hoje abordaremos um recurso bastante simples, mas muito pouco usado pela grande maioria dos desenvolvedores, o HashTable Collection.
por Rodrigo S. Donini
Figura 1: Modelo de interface para simulação do recurso
A classe HashTable está definida na namespace System,Collections, a qual necessitaremos adicionar a referência no arquivo trabalhado.
Faça download do fonte: HashTable.zip
Construindo a tabela
A Coleção HashTable armazena os dados com pares de chaves e valores (key, value) e usa a chave para obter os valores armazenados na tabela. O valor desta chave não pode ser duplicado.
Para este exemplo criaremos uma classe Pessoa para armazenarmos os dados na HashTable, e o sobrenome será a nossa chave.
Este exemplo pode ser feito com qualquer tipo de projeto do Visual Studio, seja ele WinApp, WebApp ou Console, etc. Montaremos nosso exemplo tendo como base uma WinApp.
A classe Pessoa
Vamos adicionar ao nosso projeto uma chamada Pessoa.cs.
Esta classe por sua vez, terá um construtor que pegará os parâmetros do Nome e Sobrenome e os atribuirá a variáveis locais.
A função ToString fará o override da ToString da classe Object e retornará o nome e sobrenome juntos. Acompanhe na listagem 1.
public class Pessoa { public string _nome, _sobrenome = null; public Pessoa(string Nome, string Sobrenome) { _nome = Nome; _sobrenome = Sobrenome; } public override string ToString() { return _nome + " " + _sobrenome; } } Listagem 1: Classe Pessoa
Criando o objeto HashTable e declarando as variáveis do tipo Pessoa no nível do formulário.
private Hashtable Pessoas = new Hashtable(); Pessoa Pessoa1, Pessoa2, Pessoa3, Pessoa4; Listagem 2
Adicionando itens
Agora vamos adicionar algumas pessoas utilizando o método que criamos na classe Pessoa, e adicionar esses objetos ao HashTable dentro de um bloco try-catch para rastrearmos alguma exceção que possa vir a acontecer, como por exemplo, uma chave duplicada.
Adicione um botão no formulário com o nome Adicionar, dê um duplo clique no botão e adicione o código da Listagem 3 dentro do evento _Click.
Pessoa1 = new Pessoa("Rodrigo", "Donini"); Pessoa2 = new Pessoa("Lisiano", "Hacker"); Pessoa3 = new Pessoa("Felipe", "Plets"); Pessoa4 = new Pessoa("Nasa", "Vale"); try { Pessoas.Add(Pessoa1._sobrenome, Pessoa1); Pessoas.Add(Pessoa2._sobrenome, Pessoa2); Pessoas.Add(Pessoa3._sobrenome, Pessoa3); Pessoas.Add(Pessoa4._sobrenome, Pessoa4); MessageBox.Show("Itens adicionados"); } catch (ArgumentException ae) { MessageBox.Show("Chave duplicada"); MessageBox.Show(ae.Message); } Listagem 3: Adicionando itens
Buscando itens
O HashTable prove um indexador, veja na Listagem 4 como o indexador que é a chave serve para buscar o item armazenado na coleção do HashTable.
Adicione um botão no formulário com o nome Buscar, dê um duplo clique no botão e adicione o código da Listagem 4 dentro do evento _Click.
try { MessageBox.Show(Pessoas[Pessoa1._sobrenome].ToString()); MessageBox.Show(Pessoas[Pessoa2._sobrenome].ToString()); MessageBox.Show(Pessoas[Pessoa3._sobrenome].ToString()); MessageBox.Show(Pessoas[Pessoa4._sobrenome].ToString()); } catch (NullReferenceException nre) { MessageBox.Show("A chave não existe no Hashtable"); MessageBox.Show(nre.Message); } Listagem 4: Buscando itensRemovendo item
É bastante simples para se remover um item do HashTable, basta usarmos o método Remove, que tem como overload o objeto a ser removido da tabela (HashTable).
Adicione um botão no formulário com o nome Remover, dê um duplo clique no botão e adicione o código da Listagem 5 dentro do evento _Click.
if (Pessoas.Count == 0) MessageBox.Show("Não existem itens no Hashtable"); else { MessageBox.Show("Total itens antes de remover é " + Pessoas.Count); MessageBox.Show("Primeira pessoa removida!"); Pessoas.Remove(Pessoa1._sobrenome); } Listagem 5
Enumerando itens e chaves
Usaremos as interfaces IDictionaryEnumerator e ICollection para enumerar os valores dos itens dentro do HashTable.
Com a variável do tipo IDictionaryEnumerator chamaremos o método GetEnumerator do HashTable, retornando a coleção dos itens enumerados, e depois iremos enumerar a coleção das chaves com a variável auxiliar Icollection.
Adicione um botão no formulário com o nome Enumerar, dê um duplo clique no botão e adicione o código da Listagem 6 dentro do evento _Click.
IdictionaryEnumerator Enumerador; if (Pessoas.Count == 0) MessageBox.Show("Hashtable está vazio"); else { MessageBox.Show("Enumerando itens do Hashtable"); Enumerador = Pessoas.GetEnumerator(); while (Enumerador.MoveNext()) { MessageBox.Show(Enumerador.Value.ToString()); } } ICollection Chaves; if (Pessoas.Count == 0) MessageBox.Show("Hashtable está vazio"); else { MessageBox.Show("Retornando a coleção de chaves"); Chaves = Pessoas.Keys; foreach (object chave in Chaves) { MessageBox.Show(chave.ToString()); } } Listagem 6: Enumerando itens e chaves
Limpando o HashTable
Para limpar a coleção de itens de um HashTable, devemos apenas chamar o método Clear.
Adicione um botão no formulário com o nome Limpar, dê um duplo clique no botão e adicione o código da Listagem 7 dentro do evento _Click.
Pessoas.Clear(); MessageBox.Show("Hashtable está limpo"); Listagem 7: Limpando o HashTable
Testando
Depois de montado e compilado o projeto podemos seguir um pequeno roteiro para testar.
a. Clique em Adicionar
Os objetos Pessoa serão adicionados na coleção do HashTable.
b. Clique em Buscar.
O indexador obtém os itens na coleção do HashTable, e as pessoas adicionadas serão listadas.
c. Clique em Remover.
A primeira chave do objeto Pessoa é removida.
d. Clique em Enumerar.
São retornados os itens e as chaves da coleção do HashTable.
e. Clique em Limpar.
Limpa toda a coleção dos itens no HashTable.
Conclusão
Neste artigo vimos uma maneira fácil de manipular listas em memória, através de um modelo bastante simples e com base em uma classe auxiliar de pessoas.
A biblioteca System.Collections tem uma infinidade de outras classes para implementar listagens organizadas e Arrays, recomendo que dêem uma olhada nela através do Object Browser.
Como sempre, fico a disposição para esclarecer dúvidas, inclusive se quiserem contribuir com melhorias e dicas para o artigo, bastam me enviar um e-mail.
Um abraço e até a próxima!
Referências
Hashtable Class
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemcollectionshashtableclasstopic.asp
System.Collections Namespace
http://msdn2.microsoft.com/en-us/library/system.collections.aspx