Desenvolvimento - C#

Explorando as Coleções do .NET Framework - Parte 2

Nesta segunda parte desse nosso "passeio" pelas coleções do .NET Framework, mostrarei exemplos sobre os tipos mais utilizados (alguns nem tanto) nos namespaces System.Collections, System.Collections.Generic e System.Collections.Specialized.

por Rodolfo Paoni



Artigo atualizado em 21/01/2010.

Este e outros artigos recentes do autor Rodolfo Paoni tem como base alguns artigos do Israel Aece (http://www.linhadecodigo.com.br/Colaborador.aspx?id=55) também publicados no portal Linha de Código.


Nesta segunda parte desse nosso "passeio" pelas coleções do .NET Framework, mostrarei exemplos sobre os tipos mais utilizados (alguns nem tanto) nos namespaces System.Collections, System.Collections.Generic e System.Collections.Specialized. Vamos a eles:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Collections;

Hashtable

A Coleção HashTable armazena os dados com pares de chaves e valores (key, value) e usa a chave para obter os valores armazenados na tabela. O valor desta chave não pode ser duplicado.

// Hashtable
//Hashtable hs = new Hashtable();

//Caso queria que as chave não sejam "Case Sensitive"
Hashtable hs = CollectionsUtil.CreateCaseInsensitiveHashtable();
hs.Add("Rodolfo", "rodolfo@net.com");
hs.Add("Iuri", "iuri@net.com");

foreach (DictionaryEntry de in hs)
{
Console.WriteLine(de.Value.ToString());
}

Console.WriteLine();

// Recuperando com Iterator
IDictionaryEnumerator en = hs.GetEnumerator();

while (en.MoveNext())
{
Console.WriteLine(en.Value.ToString());
}

// Recuperando apenas um valor, pela chave - Case Insensitive, neste caso
Console.WriteLine("Pela chave: " + hs["rodolfo"].ToString());

ListDictionary

Essencialmente o mesmo tipo de coleção do HashTable, mas recomendado para quando o número de itens da coleção for pequeno, em torno de 10 elementos.

ListDictionary lst = new ListDictionary();

lst.Add("Rodolfo", "rodolfo@net.com");
lst.Add("Iuri", "iuri@net.com");

foreach (DictionaryEntry lst1 in lst)
{
Console.WriteLine(lst1 .Key.ToString() + " - " + lst1 .Value.ToString());
}

HybridDictionary

Uma coleção que utiliza internamente HashTable ou Arraylist, de acordo com a quantidade de elementos.

HybridDictionary lst2 = new HybridDictionary();

lst2 .Add("Rodolfo", "rodolfo@net.com");
lst2 .Add("Iuri", "iuri@net.com");

foreach (DictionaryEntry lst3 in lst2)
{
Console.WriteLine(lst3 .Key.ToString() + " - " + lst3 .Value.ToString());
}

SortedList

Essencialmente o mesmo tipo de coleção da HashTable, com a diferença dos itens serem ordenados automaticamente pela cha, assim que adicionados à coleção. Há um arelativa perda de performance devido à esta ordenação automática pela chave.

// SortedList - Lista ordenada
//SortedList list = new SortedList();
SortedList list = CollectionsUtil.CreateCaseInsensitiveSortedList();
list.Add("RJ", "Rio de Janeiro");
list.Add("AC", "Acre");
list.Add("SP", "São Paulo");

foreach (DictionaryEntry entry in list)
Console.WriteLine(entry.Key + " - " + entry.Value);

Dictionary

Pode ser resumido basicamente como um HashTable genérico, opnde definimos o tipo da chave e do valor no momento da criação do dicionário:

//Hashtable "genérico"
Dictionary<string, Usuario> dic = new Dictionary<string, Usuario>();
dic.Add("RP", new Usuario("Rodolfo Paoni"));
dic.Add("RC", new Usuario("Rodrigo Carlos"));
dic.Add("GS", new Usuario("Graziela Silva"));

foreach (KeyValuePair<string, Usuario> pair in dic)
{
Console.WriteLine(pair.Value.Nome);
}

Console.WriteLine(dic["RP"].Nome);

StringColletion

Coleção específica, otimizada para trabalhar com strings.

//Collection específica para strings
StringCollection nomes = new StringCollection();
nomes.Add("Rodolfo");
nomes.Add("Rodrigo");
nomes.Add("Ronald");

for (int i = 0; i < nomes.Count; i++)
{
Console.WriteLine("Nome: " + nomes[i]);
}

Console.WriteLine();

//Recuperando com Iterator
StringEnumerator enumer = nomes.GetEnumerator();

while (enumer.MoveNext())
{
Console.WriteLine("Nome: " + enumer.Current);
}

Console.WriteLine();

StringDictionary

Dicionário otimizado para trabalhar com chave/valor do tipo string.

StringDictionary sd = new StringDictionary();
sd.Add("ES", "Espírito Santo");
sd.Add("RJ", "Rio de Janeiro");
sd.Add("SP", "São Paulo");

foreach (DictionaryEntry entry in sd)
Console.WriteLine(entry.Key + " - " + entry.Value);

Console.WriteLine();

OrderedDictionary

Uma mistura de SortedList com ArrayList, onde ositens podem ser recuperados pela chave ou índice.

OrderedDictionary d = new OrderedDictionary();
d.Add("ES", "Espírito Santo");
d.Add("RJ", "Rio de Janeiro");
d.Add("SP", "São Paulo");

//2 formas válidas de acessar
Console.WriteLine(d["RJ"]);
Console.WriteLine(d[1]);

Console.WriteLine();

NameValueCollection

É uma coleção do tipo chave/valor onde as chaves podem ser repetidas. Seu uso pode ser muito útil quando deseja-se agrupar valores com uma mesma chave.

NameValueCollection query = new NameValueCollection();
query.Add("Alunos", "Roberta");
query.Add("Alunos", "rogéria");
query.Add("Alunos", "Rodrigo");
query.Add("Alunos", "Ronald");
query.Add("Alunos", "Charles");
query.Add("Instrutor", "Rodolfo");

foreach (string s in query.AllKeys)
Console.WriteLine("{0} - {1}", s, query[s]);

Este foi um resumo sobre as principais coleções do .NET Framework. É importante destacar que também podemos utilizar loops convencionais para recuperar as chaves e valores de dicionários, como por exemplo:

for ( int i = 0; i < dicionario.Length; i++ )
Console.WriteLine( dicionario[i].Key + " - " + dicionario[i].Value );
Console.WriteLine();

Explore mais as coleções que o .NET oferece e tenha bons projetos.
Abraços

Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni