Dev (Back & Front)ARTIGO

HybridDictionary Class – Obtendo melhor desempenho com coleções de objetos

Com certeza a maioria dos desenvolvedores, até os menos experientes, conhecem ou já ouviram falar da classe HashTable, utilizada com excelente desempenho para trabalhar com grandes coleções de objetos.

Na maioria dos casos a classe HashTable é usada para mapear pares Chave/ Valor de objetos como, por exemplo, na demonstração abaixo:

Hashtable usuario = new Hashtable();
        
        usuario["001"] = "João";
        usuario["002"] = "Maria";
        usuario["003"] = "Claudio";
        usuario["004"] = "Rafael";
        usuario["005"] = "Ibraim";

        foreach (DictionaryEntry HT in usuario)
        {
            Response.Write(HT.Value + "<br>"); //<br> Para quebrar linha na visualização
        }

No entanto, a classe HashTable é normalmente utilizada para coleções com mais de 10 itens. Para coleções com até 10 itens, essa classe apresenta ineficiência, sendo melhor usar a classe ListDictionary, criada exatamente para lidar com pequenas coleções de até 10 itens, pode ser declarada da seguinte forma: “ListDictionary usuario = new ListDictionary();”. Essa classe tem a mesma finalidade que a anterior, no entanto, teremos melhor desempenho ao trabalhar com pequenas listas de objetos.

Agora já sabemos que para coleções com grande quantidade de objetos usaremos a classe HashTable, e quando precisarmos de uma coleção com uma pequena quantidade de itens devemos utilizar a classe ListDictionary. Mas o que fazer quando não conhecemos o tamanho da coleção que iremos armazenar em nossa estrutura?

Existe um recurso no FrameWork .Net desconhecido até por alguns programadores experientes, chamado HybridDictionary. Essa classe consegue discernir qual a melhor estrutura baseada na quantidade de itens da coleção carregada. Funciona da seguinte forma: Enquanto a coleção tiver menos de 10 itens, ele mantém a estrutura do ListDictionary mencionado anteriormente; quando a estrutura cresce e ultrapassa os limites que garantem melhor desempenho para a aplicação, ele automaticamente transforma essa estrutura em uma HashTable.

Essa classe é altamente recomendada quando o número de elementos da coleção é desconhecido. Ela aproveita o melhor do desempenho de um ListDictionary com pequenas coleções e oferece a flexibilidade de mudar para uma Hashtable que manipula melhor coleções com maiores quantidades de elementos.

A declaração foreach requer o tipo de cada elemento na coleção. Uma vez que cada elemento do HybridDictionary é um par chave / valor, o tipo do elemento não é o tipo da chave ou do valor. Em vez disso, o tipo de elemento é DictionaryEntry. Por exemplo:

f

oreach (DictionaryEntry HD in usuario)
        {
            Response.Write(HD.Value + "<br>");
        }

Vale ressaltar que uma chave não pode ter valor nulo.

Vamos reescrever os exemplos dados no início e mais algumas demonstrações usando a classe HybridDictionary:

using System.Collections;
using System.Collections.Specialized;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Criando e inicializando uma nova HybridDictionary.
        HybridDictionary usuario = new HybridDictionary();

        //Adicionando items a coleção
        usuario["001"] = "João";
        usuario["002"] = "Maria";
        usuario["003"] = "Claudio";
        usuario["004"] = "Rafael";
        usuario["005"] = "Ibraim";
        usuario["006"] = "Robson";
        usuario["007"] = "Thiago";
        usuario["008"] = "Joana";
        usuario["009"] = "Regina";
        usuario["010"] = "Anderson";
        usuario["011"] = "José";
        usuario["012"] = "Eduardo";
        usuario["013"] = "Rebeca";

        Response.Write("Conteudo da coleção:");
        Response.Write("<br>");

        //Exibindo na tela
        foreach (DictionaryEntry DE in usuario)
        {
            Response.Write("Chave: " + DE.Key + "/" + " Valor: " + DE.Value);
            Response.Write("<br>");
        }

        Response.Write("<br>");

      //Exibindo coleção usando IDictionaryEnumerator
      Response.Write("Usando IDictionaryEnumerator: <br>");
      IDictionaryEnumerator colecao = usuario.GetEnumerator();      
      while (colecao.MoveNext())
      {
          Response.Write("Chave: " + colecao.Key + "/" + " Valor: " + colecao.Value);          
          Response.Write("<br>");
      }

      Response.Write("<br>");
              
      // Copiando HybridDictionary para um array com os elementos do DictionaryEntry.
      Response.Write("Usando Array: <br>"); 
      DictionaryEntry[] array = new DictionaryEntry[usuario.Count];
      usuario.CopyTo(array, 0);

      for (int i = 0; i < array.Length; i++)
      {
          Response.Write("Chave: " + array[i].Key + "/" + " Valor: " + array[i].Value);        
          Response.Write("<br>");
      }

        Response.Write("<br>");

        //Alguns métodos úteis

        //Verifica se contém algum elemento na coleção
        if (usuario.Contains("010"))
               Response.Write("Valor encontrado!");
        else
               Response.Write("Valor não encontrado!");
       

        //Apagar um item da coleção
        usuario.Remove("013");

        //Apagar toda coleção
        usuario.Clear();
   }
}

Espero que tenham gostado. Até mais!

é MCP em .Net FrameWork 2.0 C#, graduando em Ciência da Computação pela FAESA, Analista de Sistemas (Desenvolvedor) e desenvolve desde 2004 em ASP clássico, Vb.Net e C#.

Ver perfil

Mais de Thiago Pina