Arquivo
Usando coleções no .NET
Muitas vezes nós usamos somente coleção genérica do tipo List para trabalhar com coleções, no entanto o Framework.NET tem uma coleção específica para cada caso desde pilha e fila que aprendemos na faculdade até ordenação automática. Vamos logo ao assunto aprender para que serve cada uma e como implementar.
Coleções
ArrayList
O ArrayList é uma simples coleção que você pode adicionar qualquer tipo de objeto e remover, navegar, ordenar entre outras funções básicas. Adicione uma referencia a classe System.Collections no seu fonte e veja abaixo um exemplo de sua implementação.
ArrayList lista = new ArrayList(); //Instancia um ArrayList
lista.Add(“Teste 1”); //Adiciona uma string “Teste 1”
lista.Add(“Teste 2”); //Adiciona uma string “Teste 2”
lista.Add(5); //Adiciona uma int.
lista.Add(new Byte()); //Adiciona um Byte
lista.Remove(“Teste 2”); //Remove uma string “Teste 2” da lista
lista.Insert(2, “Teste 3”); //Insere uma string “Teste 3” na posição 2 do array
lista.AddRange(new int[] { 1, 2, 3 }); //Adiciona um array que no caso é um array de int
lista.RemoveRange(1, 2); //Remove um range de itens. No exemplo são dois itens a partir do índice 1
lista.RemoveAt(0); //A partir de um determinado índice remove um item
Para listar todo o conteúdo que contem na sua lista utilize este exemplo.
foreach (object obj in lista)
{
Console.WriteLine(obj.ToString());
}
O ArrayList ainda possui alguns métodos interessantes que ajudam a manipular a lista.
lista.Sort(); //Ordena o itens usando a implementação do IComparable. Os itens devem ser do mesmo tipo
lista.Reverse(); //Ordena em ordem inversa os itens
Console.WriteLine(lista.BinarySearch(5)); //Retorna o índice de item pesquisado.
Console.WriteLine(lista.Contains(5)); //Verifica se lista contem um determinado objeto
StringCollection
Esta classe trabalha de forma semelhante a classe ArrayList, porém ela é especializada em strings e não contem alguns métodos de ordenação. Segue abaixo como instanciá-la.
StringCollection listaString = new StringCollection();
Queue – Fila
Coleção que funciona como uma “Fila”, isto é, primeiro elemento que entra na coleção é o primeiro que sai. Muito útil em situações que você precisa de uma ordem de processamento por item.
Queue fila = new Queue(); //Instancia a fila
fila.Enqueue(“Teste 1”); //Adiciona um item na fila
fila.Enqueue(“Teste 2”); //Adiciona um item na fila
Console.WriteLine(fila.Dequeue()); //Retorna e remove automaticamente o primeiro item inserido na fila
fila.Peek(); //Retorna o primeiro item inserido na fila sem remove-lo da lista
Stack – Pilha
Coleção que funciona como uma “Pilha”, isto é, primeiro elemento que entra na coleção é o ultimo que sai.
Stack pilha = new Stack(); //Instancia a pilha
pilha.Push(“Teste 1”); //Adiciona um item na pilha
pilha.Push(“Teste 2”); //Adiciona um item na pilha
Console.WriteLine(pilha.Pop()); //Retorna e remove automaticamente o último elemento inserido da pilha
pilha.Peek(); //Retorna o último elemento inserido na pilha sem remove-lo da lista
Dicionários
Os dicionários funcionam de modo semelhante as coleções com chaves que poderão ser usadas como índices. Estas chaves facilitam, e muito, a pesquisa de itens na lista.
SortedList
Esta classe é uma lista que se auto-ordena a medida que você vai inserindo os itens de acordo acordo com a chave que você esta passando como parâmetro.
SortedList listaOrdenada = new SortedList(); //Instancia a classe
listaOrdenada.Add(“Chave 2”, “Teste 1”); //Adiciona um item com a chave “Chave 2” e valor “Teste 1”
listaOrdenada.Add(“Chave 3”, “Teste 2”); //Adiciona um item com a chave “Chave 3” e valor “Teste 2”
listaOrdenada.Add(“Chave 1”, “Teste 3”); //Adiciona um item com a chave “Chave 1” e valor “Teste 3”
Para recuperar os itens da lista e verificar qual a ordem que o conteúdo esta na lista utilize o seguinte código.
foreach (DictionaryEntry item in listaOrdenada)
{
Console.WriteLine(item.Value);
}
Como todo dicionário você poderá recuperar um item específico de acordo com a chave.
Console.WriteLine(listaOrdenada[“Chave 2”]);
Segue alguns métodos que são úteis para a manipulação da SortedList
Console.WriteLine(listaOrdenada.ContainsKey(“Chave 2”)); // Verifica se uma determinada chave existe na lista
Console.WriteLine(listaOrdenada.ContainsValue(“Teste 3”)); //Verifica se um determinado valor existe na lista
Console.WriteLine(listaOrdenada.GetByIndex(0)); //Retorna o valor de um determinado índice da lista
Console.WriteLine(listaOrdenada.GetKey(0)); //Retorna a chave de acordo com o índice
Console.WriteLine(listaOrdenada.IndexOfValue(“Teste 3”)); //Retorna o índice de acordo com o valor
Console.WriteLine(listaOrdenada.IndexOfKey(“Chave 2”)); //Retorna a índice de acordo com a chave
NameValueCollection
Semelhante a SortedList com algumas diferenças como: Especializada em strings, não possui ordenação automática, pode ser acessada tanto pela chave quanto por índice e você pode adicionar mais de um valor com a mesma chave.
NameValueCollection nomeValorLista = new NameValueCollection(); //Instancia a Classe
nomeValorLista.Add(“Nome 1”, “Valor 1”); //Adiciona um item
Console.WriteLine(nomeValorLista[0]); //Recupera um valor de acordo com o índice
Console.WriteLine(nomeValorLista[“Nome 1”]); //Recupera um valor de acordo com a chave
StringDictionary
StringDictionary é um dicionário especializado em strings que armazena seus valores em uma tabela hash. Utiliza o namespace System.Collections.Specialized e a forma de implementar é muito semelhante ao SortedList por isso vou demonstrar apenas como se instancia a classe.
StringDictionary stringDic = new StringDictionary();
ListDictionary
Semelhante ao StringDictionary mas não é especializado em strings e ela foi projetada para ter performance quando utilizar quando você manipular menos de 10 itens.
ListDictionary listDic = new ListDictionary();
HashTable
Semelhante ao ListDictionary porém com a recomendação de utiliza-la quando você manipular acima de 10 itens.
Hashtable hash = new Hashtable();
HybridDictionary
Como o próprio nome nos sugestiona, esta classe trabalha de forma hibrida. Ela funciona como um ListDictionary quando você tem menos de 10 itens e como um HashTable quando você passa desta quantidade.
HybridDictionary hybriDic = new HybridDictionary();
Coleções genéricas
Na minha opinião as coleções genéricas são uma nova versão das antigas coleções e dicionários. Você percebeu que, com exceção das coleções especializadas em strings, todos os itens que eu expliquei aceitam qualquer tipo de objeto dentro da lista, isto pode causar exceções na hora da conversão, queda de performance devido ao boxing e unboxing e não queda na produtividade devido a não saber qual tipo de objeto irá retornar.
Para acabar com este problema, criou-se as coleções genéricas, que recebem um parâmetro informando qual tipo de objeto irá trabalhar dentro da lista.
Segue abaixo uma tabela de substituição.
Classe Genérica | Classe não genérica |
List<T> | ArrayList, StringCollection |
Dictionary<T,U> | HashTable, ListDictionary, HybridDictionary, OrderedDictionary, NameValueCollection, StringDictionary |
Queue<T> | Queue |
Stack<T> | Stack |
SortedList<T,U> | SortedList |
Collection<T> | CollectionBase |
ReadOnlyCollection<T> | ReadOnlyCollectionBase |
List<T>
Para instanciar uma List<T> do tipo genérico, você deve passar como parâmetro a classe definindo que a coleção será um determinado tipo e adicionar o namespace System.Collections.Generic. No exemplo abaixo estou dizendo que a minha lista irá apenas elementos do tipo int.
List<int> list = new List<int>();
Você irá perceber que, diferente das coleções explicadas anteriormente, esta lista irá apenas aceitar valores do tipo int e também só irá retornar valores deste mesmo tipo.
list.Add(1); //O método Add agora só aceita int como parâmetro.
E na hora de recuperar os valores eu posso esperar o tipo correto.
foreach (int numero in list)
{
Console.WriteLine(numero.ToString());
}
Outra característica muito útil que as coleções genéricas têm é possibilidade de usar suas próprias classes para definir o tipo da lista.
List<Pessoa> list = new List<Pessoa>(); //No caso estou indicando para que seja criada uma lista da classe Pessoa.
SortedList<T,U>
Funciona da mesma forma que a SortedList não genérica que mantem sempre a coleção ordenada, porem você pode configurar o tipo de chave e valor que você irá utilizar. Segue abaixo um exemplo de implementação.
SortedList<int, Pessoa> listaOrdenada = new SortedList<int, Pessoa>(); //Instancio indicando que a chave será um int e o valor Pessoa
listaOrdenada.Add(3, new Pessoa(“Teste1”)); //Adiciono a chave 3 e o valor Pessoa(“Teste1”)
listaOrdenada.Add(1, new Pessoa(“Teste2”)); //Adiciono a chave 3 e o valor Pessoa(“Teste1”)
listaOrdenada.Add(2, new Pessoa(“Teste3”)); //Adiciono a chave 3 e o valor Pessoa(“Teste1”)
foreach (Pessoa pessoa in listaOrdenada.Values)
{
Console.WriteLine(pessoa.ToString()); //Retorna o valor na ordem correta de acordo com a chave
}
Queue<T> – Fila genérica
Funciona da mesma forma que a classe Queue não genérica, porém você pode configurar qual o tipo de objeto estará dentro da sua lista. Segue abaixo como instancia-la.
Queue<Pessoa> fila = new Queue<Pessoa>();
Stack<T> – Pilha genérica
De semelhante modo.
Stack<Pessoa> pilha = new Stack<Pessoa>();
Dictionary<T,U>
O Dictionary genérico substitui todos dicionários demonstrados anteriormente.
Dictionary<int, Pessoa> dicGenerico = new Dictionary<int, Pessoa>(); //Instancio o dicionário com a chave do tipo int e valor do tipo Pessoa