O que é Hashtable?
A classe Hashtable do namespace System.Collections permite armazenar dados em formato de pares chave-valor, onde cada chave é única e utilizada para acesso rápido ao valor correspondente. Ambos os elementos (chave e valor) são armazenados como objetos do tipo object, permitindo flexibilidade de tipos.
Quando utilizar Hashtable
- Quando há necessidade de acesso frequente a dados;
- Grande volume de informações;
- Uso de chaves do tipo string;
- Dados heterogêneos, com tipos variados.
Operações básicas
Para usar Hashtable, importe os namespaces necessários:
using System.Collections;
using System.Collections.Generic;
Exemplo de operações comuns:
// Criando uma instância
Hashtable tabela = new Hashtable();
// Adicionando elementos
tabela.Add("SP", "São Paulo");
// Removendo um elemento
tabela.Remove("SP");
// Verificando existência
if (tabela.Contains("RJ")) {
Console.WriteLine("Chave RJ encontrada.");
}
// Limpando toda a tabela
tabela.Clear();
Exemplo completo em console
using System;
using System.Collections;
class Program {
static void Main() {
Hashtable capitais = new Hashtable();
capitais.Add("SP", "São Paulo");
capitais.Add("RJ", "Rio de Janeiro");
capitais.Add("MG", "Belo Horizonte");
// Acessando valor
Console.WriteLine(capitais["SP"]);
// Verificando existência
Console.WriteLine(capitais.Contains("MG"));
// Removendo elemento
capitais.Remove("RJ");
// Limpando dados
capitais.Clear();
}
}
Trabalhando com múltiplos tipos
using System;
using System.Collections;
class Program {
static void Main() {
Hashtable dados = new Hashtable();
dados.Add("nome", "Carlos");
dados.Add("idade", 35);
string nome = (string)dados["nome"];
int idade = (int)dados["idade"];
Console.WriteLine($"Nome: {nome}, Idade: {idade}");
}
}
Evitando InvalidCastException
using System;
using System.Collections;
class Program {
static void Main() {
Hashtable dados = new Hashtable();
dados.Add("descricao", "Produto A");
// Usando operador 'as' para evitar exceções
string texto = dados["descricao"] as string;
if (texto != null) {
Console.WriteLine(texto);
}
// Verificação segura com 'is'
if (dados["descricao"] is string) {
Console.WriteLine("O valor é uma string.");
}
}
}
Como percorrer uma Hashtable
using System;
using System.Collections;
class Program {
static void Main() {
Hashtable estados = new Hashtable();
estados.Add("SP", "São Paulo");
estados.Add("RJ", "Rio de Janeiro");
// Percorrendo com DictionaryEntry
foreach (DictionaryEntry item in estados) {
Console.WriteLine($"Chave: {item.Key}, Valor: {item.Value}");
}
// Percorrendo apenas chaves
foreach (string chave in estados.Keys) {
Console.WriteLine($"Chave: {chave}");
}
// Percorrendo apenas valores
foreach (string valor in estados.Values) {
Console.WriteLine($"Valor: {valor}");
}
}
}
Ordenação de Hashtable
A classe Hashtable não mantém ordem interna, mas é possível ordenar manualmente:
ArrayList listaChaves = new ArrayList(estados.Keys);
listaChaves.Sort(); // Ordena alfabeticamente
foreach (string chave in listaChaves) {
Console.WriteLine($"{chave}: {estados[chave]}");
}
Comparação com Dictioanry
Para cenários com tipos definidos, o Dictionary<tkey tvalue=""></tkey> do namespace System.Collections.Generic é mais eficiente:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
class Program {
static void Main() {
Stopwatch cronometro = new Stopwatch();
Hashtable tabela = new Hashtable();
Dictionary<string int=""> dicionario = new Dictionary<string int="">();
int maximo = 1000000;
cronometro.Start();
for (int i = 0; i < maximo; i++) {
tabela.Add(i.ToString(), i);
}
cronometro.Stop();
Console.WriteLine($"Hashtable Add: {cronometro.ElapsedMilliseconds} ms");
cronometro.Restart();
for (int i = 0; i < maximo; i++) {
dicionario.Add(i.ToString(), i);
}
cronometro.Stop();
Console.WriteLine($"Dictionary Add: {cronometro.ElapsedMilliseconds} ms");
}
}
</string></string>
Conclusão: Dictionary é mais rápido em operações frequentes de busca, especialmente com tipos primitivos, devido ao uso de generics.