Tabela hash C# com exemplos

โšก Resumo Inteligente

Em C#, uma Hashtable รฉ uma coleรงรฃo do namespace System.Collections que armazena dados como pares chave-valor, onde cada chave exclusiva corresponde a um valor e a chave permite uma busca rรกpida desse valor armazenado.

  • ๐Ÿ“š Pares chave-valor: Uma tabela hash armazena dois valores por elemento, uma chave e seu valor, em vez do valor รบnico armazenado em uma pilha ou lista de arrays.
  • โž• Adicionando elementos: O mรฉtodo Add insere uma chave e um valor juntos, e cada chave dentro da Hashtable deve ser รบnica.
  • ???? ContainsKey e ContainsValue: Esses mรฉtodos retornam verdadeiro ou falso, permitindo que vocรช verifique se uma chave ou um valor jรก existe.
  • ๐Ÿ” Valores de leitura: A propriedade Keys, com um ICollection ou um loop DictionaryEntry, permite ler cada valor armazenado em sequรชncia.
  • ๐Ÿ› ๏ธ Mรฉtodos e propriedades: Remover, Limpar, Contar, Chaves e Valores gerenciam e inspecionam o conteรบdo da tabela hash.
  • ๐Ÿค– Assistรชncia de IA: O GitHub Copilot cria cรณdigo baseado em Hashtable, enquanto as linguagens modernas C# e ML.NET preferem o uso do dicionรกrio genรฉrico para dados de chave-valor com seguranรงa de tipos.

Tabela hash C#

O que รฉ Hashtable em C#?

Uma tabela hash รฉ uma coleรงรฃo especial usada para armazenar itens de valor-chave. Portanto, em vez de armazenar apenas um valor como pilha, lista de array e fila, a tabela hash armazena 2 valores. Esses 2 valores formam um elemento da tabela hash.

Abaixo estรฃo alguns exemplos de como podem ser os valores de uma tabela hash.

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

Acima temos 3 pares de valores-chave. As chaves de cada elemento sรฃo 001, 002 e 003 respectivamente. Os valores de cada par de valores-chave sรฃo โ€œ. Netโ€œ, โ€œC#โ€ e โ€œASP.Netโ€ respectivamente.

Vejamos as operaรงรตes disponรญveis para a coleรงรฃo Hashtable com mais detalhes.

Declaraรงรฃo da Hashtable

A declaraรงรฃo de uma Hashtable รฉ mostrada abaixo. Um Hashtable รฉ criado com a ajuda do tipo de dados Hashtable. A palavra-chave โ€œnewโ€ รฉ usada para criar um objeto de uma Hashtable. O objeto รฉ entรฃo atribuรญdo ร  variรกvel ht.

Hashtable ht = new Hashtable()

Adicionando elementos ao Hashtable

O mรฉtodo Add รฉ usado para adicionar um elemento ao fila. A sintaxe geral da instruรงรฃo รฉ fornecida abaixo

HashTable.add("key","value")

1 exemplo:

Lembre-se de que cada elemento da tabela hash รฉ composto por 2 valores, um รฉ a chave e o outro รฉ o valor.

Agora, vamos ver isso funcionando no nรญvel do cรณdigo. Todo o cรณdigo mencionado abaixo serรก gravado em nosso aplicativo de console.

O cรณdigo serรก gravado em nosso arquivo Program.cs. No programa abaixo, escreveremos o cรณdigo para ver como podemos usar os mรฉtodos mencionados acima.

Por enquanto, em nosso exemplo, veremos apenas como podemos criar uma hashtable, adicionar elementos ร  hashtable e exibi-los de acordo.

Tabela hash em C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code Explicaรงรฃo:-

  1. Primeiro, declaramos a variรกvel hashtable usando o tipo de dados Hashtable usando a palavra-chave โ€œNovoโ€. O nome da variรกvel definida รฉ 'ht'.
  2. Em seguida, adicionamos elementos ร  tabela hash usando o mรฉtodo Add. Lembre-se de que precisamos adicionar um elemento chave e um elemento de valor ao adicionar algo ร  tabela hash.
  3. Nรฃo existe uma maneira direta de exibir os elementos de uma tabela hash.
    • Para exibir a tabela hash, primeiro precisamos obter a lista de chaves (001, 002 e 003) da tabela hash.
    • Isso รฉ feito atravรฉs da interface ICollection. Este รฉ um tipo de dados especial que pode ser usado para armazenar as chaves de coleรงรตes de hashtable. Em seguida, atribuรญmos as chaves da coleรงรฃo hashtable ร  variรกvel 'keys'.
  4. A seguir, para cada valor-chave, obtemos o valor associado na tabela hash usando a instruรงรฃo ht[k].

Se o cรณdigo acima for inserido corretamente e o programa for executado, a seguinte saรญda serรก exibida.

Saรญda:

Tabela hash em C#

Vejamos mais alguns mรฉtodos disponรญveis para tabelas hash.

ContรฉmChave

Este mรฉtodo รฉ usado para verificar se uma chave estรก presente na Hashtable. Abaixo estรก a sintaxe geral desta instruรงรฃo. A instruรงรฃo retornarรก verdadeiro se a chave existir, caso contrรกrio, retornarรก o valor falso.

Hashtable.Containskey(key)

ContรฉmValor

Este mรฉtodo รฉ usado para verificar se um valor estรก presente na tabela Hash. Abaixo estรก a sintaxe geral desta instruรงรฃo. A instruรงรฃo retornarรก verdadeiro se o Valor existir, caso contrรกrio, retornarรก o valor falso.

Hashtable.ContainsValue(value)

2 exemplo:

Vamos mudar o cรณdigo em nosso Aplicaรงรฃo da consola para mostrar como podemos usar os mรฉtodos โ€œContainskeyโ€ e โ€œContainsValueโ€.

Tabela hash em C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code Explicaรงรฃo:-

  1. Primeiro, usamos o mรฉtodo ContainsKey para ver se a chave estรก presente na tabela hash. Este mรฉtodo retornarรก verdadeiro se a chave estiver presente na tabela hash. Este mรฉtodo deve retornar verdadeiro, pois a chave existe na tabela hash.
  2. Em seguida, usamos o mรฉtodo ContainsValue para ver se o valor estรก presente na tabela hash. Este mรฉtodo retornarรก 'true', pois o valor existe na tabela hash.

Se o cรณdigo acima for inserido corretamente e o programa for executado, a seguinte saรญda serรก exibida.

Saรญda:

Tabela hash em C#

Na saรญda, vocรช pode ver claramente que tanto a chave quanto o valor pesquisado estรฃo presentes na tabela hash.

Como percorrer uma tabela hash em C#

Os exemplos acima leem valores atravรฉs da coleรงรฃo Keys, mas uma Hashtable pode ser percorrida de uma maneira mais limpa. Um loop foreach sobre um DictionaryEntry retorna a chave e o valor de cada elemento em uma รบnica passagem, que รฉ a maneira mais comum de ler uma Hashtable.

Passo 1) Crie uma tabela hash e adicione trรชs pares de chave-valor a ela.

Passo 2) Percorra a tabela hash com uma variรกvel DictionaryEntry e, em seguida, leia as propriedades Key e Value de cada entrada.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code Explicaรงรฃo:-

  1. Uma tabela hash chamada ht รฉ criada e trรชs pares chave-valor sรฃo inseridos com o mรฉtodo Add.
  2. O loop foreach atribui cada elemento a um DictionaryEntry, cujas propriedades Key e Value expรตem as duas metades do par.

Quando o programa รฉ executado, ele imprime cada chave ao lado de seu valor, como por exemplo, 101 โ€“ JavaComo uma tabela hash nรฃo mantรฉm a ordem de inserรงรฃo, os pares podem aparecer em uma sequรชncia diferente daquela em que foram adicionados. Para ler apenas as chaves, percorra a coleรงรฃo `Keys`, e para ler apenas os valores, percorra a coleรงรฃo `Values`.

Mรฉtodos e propriedades de tabelas hash em C#

A classe Hashtable expรตe um pequeno conjunto de mรฉtodos e propriedades que abrangem quase todas as tarefas necessรกrias, desde adicionar e remover pares atรฉ verificar a associaรงรฃo e contar elementos. Os membros mais รบteis estรฃo listados abaixo.

Vogal Formato Descriรงรฃo
Adicionar(chave, valor) Forma Insere um novo par chave-valor; a chave deve ser รบnica.
Remover(chave) Forma Exclui o elemento que corresponde ร  chave especificada.
Claro() Forma Remove todos os pares chave-valor da tabela hash.
ContรฉmChave(chave) Forma Retorna verdadeiro quando a chave fornecida estiver presente.
ContรฉmValor(valor) Forma Retorna verdadeiro quando o valor fornecido estiver presente.
Contar Propriedade Obtรฉm o nรบmero de pares chave-valor armazenados.
As chaves Propriedade Retorna uma coleรงรฃo de todas as chaves.
Valores Propriedade Retorna uma coleรงรฃo de todos os valores.

Como cada chave รฉ transformada em hash, o ContainsKey e o indexador localizam um elemento em tempo quase constante, o que torna uma tabela hash tรฃo รบtil para buscas rรกpidas.

Diferenรงa entre Hashtable e Dictionary em C#

Tanto uma Hashtable quanto um Dictionary armazenam pares de chave-valor e ambos pertencem ร  famรญlia mais ampla de classes do C#. coleรงรตesA diferenรงa crucial reside na seguranรงa de tipos, e essa diferenรงa determina qual vocรช deve usar em um novo cรณdigo.

  • Seguranรงa do tipo: Uma tabela hash armazena cada chave e valor como um objeto, enquanto um dicionรกrio ร‰ genรฉrico, portanto o compilador verifica os tipos que vocรช usa.
  • Domรญnio: Hashtable reside em System.Collections, enquanto Dictionary reside em System.Collections.Generic.
  • Boxing: Uma Hashtable encapsula tipos de valor como int, mas um Dictionary genรฉrico os armazena diretamente e evita esse custo.
  • Desempenho: O dicionรกrio geralmente รฉ mais rรกpido porque nรฃo exige conversรฃo de valor de objeto para dicionรกrio ao ler um valor.
  • Seguranรงa da rosca: O Hashtable oferece o SyncWrapper cronizado para um escritor com muitos leitores, enquanto o cรณdigo concorrente geralmente escolhe ConcurrentDictionary.

Para qualquer projeto novo, o dicionรกrio genรฉrico รฉ a escolha recomendada, e a tabela hash nรฃo genรฉrica aparece principalmente em cรณdigos mais antigos.

Perguntas Frequentes

O mรฉtodo Remove remove o elemento com uma determinada chave e decrementa o contador (Count) em um. Se a chave nรฃo existir, nada acontece; portanto, chame ContainsKey primeiro quando precisar ter certeza de que a chave estรก presente.

Nรฃo. Cada chave em uma Hashtable deve ser รบnica. Chamar o mรฉtodo Add com uma chave que jรก existe gera uma ArgumentException. No entanto, vocรช pode armazenar o mesmo valor com vรกrias chaves diferentes sem nenhum erro.

Uma tabela hash permite que um escritor tenha vรกrios leitores com seguranรงa. Para vรกrias linhas de escrita, utilize uma tabela hash.SyncSe preferir, use o ConcurrentDictionary do System.Collections.Concurrent, que lida com leituras e gravaรงรตes simultรขneas sem bloqueios externos.

A busca de um valor por chave tem um tempo mรฉdio quase constante de O(1), porque a chave รฉ transformada em um hash para encontrar seu bucket. Colisรตes de hash frequentes podem tornar o processo mais lento, mas isso รฉ raro com chaves bem distribuรญdas.

Um valor pode ser nulo, mas uma chave nรฃo. Passar uma chave nula para o mรฉtodo `Add` ou para o indexador gera uma exceรงรฃo `ArgumentNullException`. Cada chave tambรฉm deve ser รบnica e nรฃo deve ser alterada enquanto estiver armazenada.

Uma Hashtable nรฃo mantรฉm ordem, portanto nรฃo pode ser ordenada no prรณprio local. Copie suas chaves para uma lista ou um ArrayList, ordene essa lista e, em seguida, leia os valores pela chave. Uma SortedList mantรฉm suas entradas ordenadas automaticamente.

Sim. O GitHub Copilot gera declaraรงรตes de Hashtable, chamadas Add e loops DictionaryEntry a partir de um comentรกrio curto ou nome de mรฉtodo. Frequentemente, ele sugere o Dictionary genรฉrico, jรก que essa รฉ a coleรงรฃo recomendada para novos cรณdigos C#.

Os dados de treinamento do ML.NET fluem por meio de coleรงรตes tipadas e do pipeline IDataView, em vez de uma Hashtable. No entanto, os mapas de chave-valor baseados em hash ainda oferecem suporte a pesquisas de recursos, codificaรงรฃo de vocabulรกrio e armazenamento em cache em torno de um modelo de aprendizado de mรกquina.

Resuma esta postagem com: