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!







