quinta-feira, 12 de janeiro de 2012

Usando Listas



A coleção List(T) representa uma coleção de objetos tipados a qual é altamente otimizada oferecendo um bom desempenho e pode ser acessada usando índice.
Esta classe fornece métodos para percorrer, filtrar, ordenar, procurar e manipular coleções. ( A versão não génerica seria a classe ArrayList ).
A Classe List() representa uma lista de objetos que podem ser acessados pelo índice. Fornece métodos para pesquisar, ordenar e manipular listas.
A classe List() é o equivalente genérico da classe ArrayList. Ele implementa a interface genérica IList<(Of )>) usando uma matriz cujo tamanho é aumentado dinamicamente conforme necessário. O List() usa um comparador de igualdade e um comparador de classificação.
Obs: Métodos, como Contains, IndexOf, LastIndexOf e Remove usam um comparador de igualdade para os elementos de lista e métodos, como BinarySearch e Sort usam um comparador de classificação para os elementos de lista.
É muito importante você conhecer e saber usar a classe List() e neste artigo eu procuro mostrar algumas operações básicas.
Eu vou usar o Visual C# 2008 Express Edition nos exemplos deste artigo:
Abra o Visual C# e crie um novo projeto do tipo Windows Application com o nome usandoColecoesTipadas;
No formulário padrão form1.cs inclua os controles : ListBox , GroupBox e Button conforme o leiaute abaixo:
A primeira coisa a fazer é criar um arquivo do tipo Class onde iremos definir a nossa classe de domínio. Clique no menu Project e selecione Add Class informando o nome Pessoa.cs e clicando em Add;
Para este exemplo eu vou definir uma classe Pessoa com os seguintes atributos:
- ID , Nome , Idade e Sexo;
- Dois construtores;
using System;
using System.Collections.Generic;
using System.Text;
namespace usandoColecoesTipadas
{
class Pessoa
{
public Pessoa()
{}
public Pessoa(int _id, string _nome, short _idade, char _sexo)
{
this.p_id = _id;
this.p_nome = _nome;
this.p_idade = _idade;
this.p_sexo = _sexo;
}
private int p_id = -1;
private string p_nome = String.Empty;
private short p_idade = 0;
private char? p_sexo = null;
public int ID
{ get{return p_id;}
set{p_id = value;}}
public string Nome
{ get{return p_nome;}
set{p_nome = value;}}
public short Idade
{ get{return p_idade;}
set{p_idade = value;} }
public char? Sexo
{ get{return p_sexo;}
set{p_sexo = value;}}
}
}
Teremos que carregar a nossa coleção com dados pois vamos trabalhar com a coleção mostrando os recursos da classe List; para isso no evento Load do formulário vamos incluir o código que irá preencher a nossa lista toda a vez que o mesmo for carregado.
Eu vou definir uma rotina chamada carregaLista() que será chamada no evento Load:
private void Form1_Load(object sender, EventArgs e)
{
carregaLista();
}
O código da rotina carregaLista() é dado a seguir , nela estamos atribuindo valores para as propriedades id, nome, idade e sexo:
private void carregaLista()
{
pLista = new List();
pLista.Add(new Pessoa(1, “João”, 29, ‘M’));
pLista.Add(new Pessoa(2, “Macoratti”, 35, ‘F’));
pLista.Add(new Pessoa(3, “Americo”, 25, ‘M’));
pLista.Add(new Pessoa(4, “Katia”, 21, ‘F’));
pLista.Add(new Pessoa(5, “Lena”, 33, ‘F’));
pLista.Add(new Pessoa(6, “Suzana”, 45, ‘F’));
pLista.Add(new Pessoa(7, “Jim”, 38, ‘M’));
pLista.Add(new Pessoa(8, “Jane”, 32, ‘F’));
pLista.Add(new Pessoa(9, “Roberto”, 31, ‘M’));
pLista.Add(new Pessoa(10, “Cintia”, 25, ‘F’));
pLista.Add(new Pessoa(11, “Gina”, 27, ‘F’));
pLista.Add(new Pessoa(12, “Joel”, 33, ‘M’));
pLista.Add(new Pessoa(13, “Germano”, 55, ‘M’));
pLista.Add(new Pessoa(14, “Ricardo”, 22, ‘M’));
pLista.Add(new Pessoa(15, “Maria”, 39, ‘F’));
}
Para imprimir o resultado das operações eu vou criar uma rotina no formulário chamada Imprimir() onde eu vou passar como parâmetro a lista que eu quero imprimir e uma informação que será exibida no ListBox:
void Imprimir(List pLista, string info)
{
//limpa o controle ListBox
lstResultado.Items.Clear();
//’exibe a informação no controle, uma linha em branco e em seguida o cabeçalho
lstResultado.Items.Add(info);
lstResultado.Items.Add(“”);
lstResultado.Items.Add(“ID\tNome\tIdade\tSexo”);
//Percorre a lista e exibe os dados da mesma
pLista.ForEach(delegate(Pessoa p)
{
lstResultado.Items.Add(p.ID+ “\t”+ p.Nome+”\t”+ p.Idade + “\t” + p.Sexo);}
);
}
Obs: Os caracteres \t representam a tabulação (vbTab) e foram usados para formatar a saída na tela.
Os namespaces usados no formulário são:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
No início da definição do formulário temos que declarar uma variável do tipo List onde Pessoa é a nossa classe, de forma que ela seja visível em todo o formulário:
List pLista = null;
Agora estamos prontos para realizar as operações com a nossa lista tipada usando os recursos da classe List com C#. Vamos lá…
1- Percorrendo e exibindo todos os itens da lista
private void button1_Click(object sender, EventArgs e)
{
carregaLista();
Imprimir(pLista, “Lista ordenada por ID”);
}
2- Filtrando informações da lista usando um critério
private void button2_Click(object sender, EventArgs e)
{
List listaFiltroPorIdade = pLista.FindAll(delegate(Pessoa p) { return p.Idade > 30; });
Imprimir(listaFiltroPorIdade, “Pessoas com idades maiore que 30.”);
}
3- Ordenando a lista por um critério
private void button3_Click(object sender, EventArgs e)
{
List ordenaListaPorNome = pLista;
ordenaListaPorNome.Sort(delegate(Pessoa p1, Pessoa p2)
{
return p1.Nome.CompareTo(p2.Nome);
});
Imprimir(ordenaListaPorNome, “Lista ordenada por Nome”);
}
4- Removendo itens da lista
private void button5_Click(object sender, EventArgs e)
{
List removerLista = pLista;
removerLista.RemoveAll(delegate(Pessoa p) { return p.Sexo == ‘M’; });
Imprimir(removerLista, “Removendo da lista pessoas do sexo masculino”);
}
5- Localizando um item na lista
private void button6_Click(object sender, EventArgs e)
{
//localiza um objeto
Pessoa pessoa = pLista.Find(delegate(Pessoa p1) { return p1.ID == 10; });
lstResultado.Items.Add(“Pessoa localizada na lista com ID = 10″);
lstResultado.Items.Add(pessoa.ID+ “\t”+ pessoa.Nome+”\t”+ pessoa.Idade + “\t” + pessoa.Sexo);}
}
As listas genéricas do tipo List permitem realizar diversas operações com um bom desempenho e um código enxuto. Vale a pena se aprofundar no seu conhecimento.

sábado, 7 de janeiro de 2012

Coleções em C#



Frequentemente um Arrays é a maneira mais simples, mais direta de lidar com uma lisa de Students ou uma lista de Double. Você também encontrará muitos lugares na biblioteca de classe de NET Framework que requerem o uso do Arrays.

Mas Arrays têm algumas suficientes sérias limitações que ficarão algumas vezes no seu caminho. Nesses momentos, você apreciará o extenso repertório do C# de classes de coleção flexíveis.

Apesar dos Arrays terem a vantagem da simplicidade e poderem ter múltiplas dimensões, eles sofrem de duas coleção mais flexíveis.

  • Um programa deve declarar o tamanho de array quando ele é criado. Diferente do Visual Basic,  o C# não deixa você mudar o tamanho do array após está definido. E se você não souber de que tamanho ele precisa ser?
  • Inserir ou remover um elemento no meio de um array é loucamente ineficiente. Você tem que mover todos os elementos ao redor para abrir espaço. Em um Arrays grande, isso pode ser um trabalho enorme, consumidor de tempo.
A maioria das coleções por outro lado, tornam muito mais fácil adicionar, inserir ou remover elementos, e você  pode redimensiona-lo quando precisar, direto no fluxo de dados. Na verdade, eles geralmente cuidam do redimensionamento automaticamente.

Mas Arrays e coleção tem alguma coisa em comum:
  • Cada um pode conter elemento de um e apenas um tipo. Uma vez especificado o tipo não pode ser modificado.
  • Assim como com Arrays, você pode acessar a maioria das coleções com sintaxe tipo Arrays usando colchetes para especificar um índice: mylist[3] = "Joe". 
  • Tanto coleção quanto Arrays tem métodos e propriedades. Assim para encontrar o número de elementos no seguinte arrays smallPrimeNumbers, você chama sua propriedade Length:
var smallPrimeNumbers = new [] {2,3,5,7,11,13};                                                                                      
Enquanto que com um Coleçaõ você chamasua propriedade Count:
List<int> smallPrimeNumbers = new List<int>{2,3,5,7,11,13};                                                                   
int numElements = smallPrime.Count; // coleção tem uma propriedade cout                                                 


Veja o vídeo abaixo sobre Lista: