Desenvolvimento - C#

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

O .NET Framework tem um poderosíssimo conjunto de coleções que podemos utilizar nas nossas aplicações de maneira bem simples, localizados nos namespaces System.Collections, System.Collections.Generic e System.Collections.Specialized.

por Rodolfo Paoni



O .NET Framework tem um poderosíssimo conjunto de coleções que podemos utilizar nas nossas aplicações de maneira bem simples, localizados nos namespaces System.Collections, System.Collections.Generic e System.Collections.Specialized. Temos coleções fortemente tipadas, coleções que permitem trabalhar com qualquer tipo de dados e coleções baseadas em dicionários e tipo chave/valor. Mostrarei exemplos sobre algumas das mais importantes coleções do .NET Framework:

ArrayList

ArrayList aList = new ArrayList();
aList.Add("Rodolfo"); // Aceita qualquer object
aList.Add(1);
aList.Add(true);
aList.Add(new Cliente("Rodolfo"));

for (int i = 0; i < aList.Count; i++)
{
if (aList[i] is Cliente)
{

// Para recuperar o tipo correto, precisamos realizar comparações
Console.WriteLine("Nome: " + ((Cliente)aList[i]).Nome);
}
}

Manupulando um Array Simples em um ArrayList

int[] codigos = { 1, 2, 46, 32, 78 };
ArrayList listagem = new ArrayList(codigos); //Carrega um array

listagem.Remove(46); //Remove um elemento
listagem.Add(10);
listagem.Add(20);
listagem.Add(30); //Insere um novo elemento
Console.WriteLine(listagem.Count); //Imprime seu tamanho atual

int j = (int)listagem[2]; //Passa o valor 32 para a variável j
listagem.Sort(); //Ordena os elementos (Como os elementos são do mesmo tipo, a ordenação é simples)
codigos = new int[listagem.Count];
listagem.CopyTo(codigos); //Preenche um array
listagem.Clear(); //Remove todos elementos

Criando coleções customizadas

Como já explicado em "Generics com C# 2.0 - Revisitado", podemos criar nossas próprias coleções. Utilizávamos muito esta técnica no .NET 1.1, onde ainda não existia o Generics.

public class UsuarioCollection : CollectionBase
{
public int Add(Usuario u)
{
return base.List.Add(u);
}

public bool Contains(Usuario u)
{
return base.List.Contains(u);
}

public void Insert(int index, Usuario u)
{
base.List.Insert(index, u);
}

public Usuario this[int index]
{
get { return (Usuario)base.List[index]; }
set { base.List[index] = value; }
}

public void Remove(Usuario u)
{
base.List.Remove(u);
}
}

Utilizando Generics

List<Cliente> clientes = new List<Cliente>();
clientes.Add(new Cliente("Rodolfo", 23));
clientes.Add(new Cliente("João", 22));
clientes.Add(new Cliente("Maria", 25));

//Erro em tempo de compilação, pois a lista foi definida como uma lista de "Cliente"
//clientes.Add(new Funcionario("Rodolfo"));

clientes.Sort();
//Recuperando as informações com "foreach"
foreach (Cliente c in clientes)
{
Console.WriteLine("Nome: " + c.Nome);
}

A classe cliente implementa IComparable para permitir a odenação na lista:

public class Cliente : IComparable<Cliente>
{
private string _nome;
private int _idade;

public Cliente() { }

public Cliente(string nome, int idade)
{
this._nome = nome;
this._idade = idade;
}

public string Nome
{
get { return this._nome; }
set { this._nome = value; }
}

public int Idade
{
get { return _idade; }
set { _idade = value; }
}

#region IComparable<Cliente> Members

public int CompareTo(Cliente other)
{
return Idade.CompareTo(other.Idade);
}

#endregion
}

Na parte 2 deste artigo exploraremos mais a fundo as coleções que o .NET Framework nos oferece. Até a próxima!

Rodolfo Paoni

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