Uso avançado de Hashtable em C#

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.

Tags: Hashtable dictionary C# Collections generics

Publicado em 8-28 13:17