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



Hoje abordaremos um recurso bastante simples, mas muito pouco usado pela grande maioria dos desenvolvedores, o HashTable Collection. Usando o HashTable podemos armazenar e buscar dados de forma bastante eficiente, usando a própria chave para localizar o dado requerido.


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 itens
Removendo 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

Rodrigo S. Donini

Rodrigo S. Donini - Coordenador de desenvolvimento, líder de desenvolvimento nas tecnologias Microsoft, com fortes conhecimentos de client/server/web e metodologias de desenvolvimento.