Trabalhando com Listas (Coleções Genéricas)

Ola, Amigos.

Iniciaremos este tutorial falando sobre classe List<T> do namespace System.Collection.Generics ou também podemos falar objetos do tipo genérico.  O List<T> exige que especifique um único valor que descreva o tipo de item sobre o qual List<T> devera trabalhar ou armazenar. Portando se desejar criar três objetos List<T> para conter inteiros e os objetos SportCar() e Person(), terá que escrever o seguinte:

static void Main()
{
    List&amp;amp;lt;int&amp;amp;gt; MyInt = new List&amp;amp;lt;int&amp;amp;gt;();
    List&amp;amp;lt;SportCar&amp;amp;gt; MyCars = new List&amp;amp;lt;SportCar&amp;amp;gt;();           
    List&amp;amp;lt;Person&amp;amp;gt; MyPeople = new List&amp;amp;lt;Person&amp;amp;gt;();
}

Bom, no exemplo acima vemos como declarar um objeto do tipo List<T> e especificar o tipo que iremos objeto que este ira armazenar, podemos dizer que a classe List<T> é uma classe que pode armazenar vários tipos de objetos instanciados na memoria. Vejamos o exemplo abaixo:

private void addSportCarInList()
{
    SportCar MyCar = new SportCar();
   
    MyCar.returnModel = &amp;amp;quot;Mazda&amp;amp;quot;;
    MyCar.returnColor = &amp;amp;quot;White&amp;amp;quot;;
    MyCar.returnMaxSpeed = 210;

    List&amp;amp;lt;SportCar&amp;amp;gt; MyCars = List&amp;amp;lt;SportCar&amp;amp;gt;();
    MyCars.Add(MyCar);
}

No exemplo acima, nos criamos um objeto do tipo SportCar() e atribuímos as propriedades da classe que são: Modelo, Cor e Velocidade máxima, o valores que desejamos. Após isso criamos um objeto do tipo List<T> onde <T> nesta questão é do tipo SportCar ou seja <SportCar>.

No código acima nos podemos falar que o objeto List<SportCar> contem dentro de si uma instancia só do tipo SportCar, resumindo dentro de nossa Lista temos uma instancia de uma objeto Carro esportivo podemos comprovar isso pelo código abaixo:

MessageBox.Show(&amp;amp;quot;Total de carros em minha lista {0}&amp;amp;quot;, MyCars.Count);

No exemplo abaixo iremos adicionar vários carros em nossa lista de carros consequentemente no mundo POO (programação orientada a objeto) para cada carro iremos criar uma instancia. Vejamos no Exemplo:

private void addFiveSportCarInList()
{
    // Car 1
    SportCar MyCar1 = new SportCar();

    MyCar1.returnModel = &amp;amp;quot;Mazda&amp;amp;quot;;
    MyCar1.returnColor = &amp;amp;quot;White&amp;amp;quot;;
    MyCar1.returnMaxSpeed = 210;

    // Car 2
    SportCar MyCar2 = new SportCar();

    MyCar2.returnModel = &amp;amp;quot;Subaru&amp;amp;quot;;
    MyCar2.returnColor = &amp;amp;quot;Red&amp;amp;quot;;
    MyCar2.returnMaxSpeed = 180;

    // Car 3
    SportCar MyCar3 = new SportCar();

    MyCar3.returnModel = &amp;amp;quot;Volvo&amp;amp;quot;;
    MyCar3.returnColor = &amp;amp;quot;Green&amp;amp;quot;;
    MyCar3.returnMaxSpeed = 200;
   
    // Car 4
    SportCar MyCar4 = new SportCar();

    MyCar4.returnModel = &amp;amp;quot;Volkswagen&amp;amp;quot;;
    MyCar4.returnColor = &amp;amp;quot;Black&amp;amp;quot;;
    MyCar4.returnMaxSpeed = 240;
   
    // Car 5
    SportCar MyCar5 = new SportCar();

    MyCar5.returnModel = &amp;amp;quot;Ferrari&amp;amp;quot;;
    MyCar5.returnColor = &amp;amp;quot;Silver&amp;amp;quot;;
    MyCar5.returnMaxSpeed = 210;

    List&amp;amp;lt;SportCar&amp;amp;gt; MyCars = List&amp;amp;lt;SportCar&amp;amp;gt;();
    MyCars.Add(MyCar);

    MessageBox.Show(&amp;amp;quot;Total de carros em minha lista {0}&amp;amp;quot;, MyCars.Count);
}

Também podemos acessar métodos e propriedades do objeto SportCar() armazenado dentro de nossa lista, podemos fazer isso percorrendo nossa List<SportCar>, através de uma laço de repetição for, while, do while etc. visto que é uma lista ou também coleção de objetos. Vejamos o exemplo abaixo:

int i = 0;
for (i = 0; i &amp;amp;lt;= MyCars.Count - 1; i++)
{
    MessageBox.Show(&amp;amp;quot;Carro número {0} sua marca é: {1}&amp;amp;quot;, i.ToString(), MyCars[i].returnModel.ToString());
}

 
No código acima fazemos um laço de repetição “for” para contar nossa lista de carros e exibir o modelo de cada um deles, no caso acima igualamos nossa variável “i” igual a zero só que para uma lista a qual estamos trabalhando ou um Array (vetor) a quantidade de objetos dentro sempre se inicia em um e não em zero, é por esse motivo que colocamos no meio de laço “for”

i &amp;amp;lt;= MyCars.Count - 1

O total de itens da nossa lista menos um, isso por que nosso contador “i” é iniciado em zero.  Vale apena lembrar que a ordem em que instanciamos os objetos do mesmo tipo é a mesma ordem que esta armazenado dentro do objeto List<SportCar>.

Podemos dizer então que no caso acima em que adicionamos cinco carros em nossa lista o primeiro que instanciamos a marca dele é Mazda, pois é esse é o primeiro da nossa lista, como no exemplo do laço podemos perceber que o nome do primeiro carro que aparece no laço é o da marca Mazda, e assim por diante, como na ordem de instanciação.

Podemos também remover objetos desta lista usando o método Remove de nossa lista criada.
Vejamos no exemplo:

int i = 0;
for (i = 0; i &amp;amp;lt;= MyCars.Count - 1; i++)
{
    if (MyCars[i].returnModel == &amp;amp;quot;Volvo&amp;amp;quot;)
    {
        SportCar MyCarRemove = MyCars[i];
        MyCars.Remove(MyCarRemove);

        MessageBox.Show(&amp;amp;quot;Carro removido da lista&amp;amp;quot;);
    }   
}

No código acima nos removemos de nossa lista de carros, o carro de marca “Volvo” podemos perceber que nos criamos um objeto, mas não instanciamos um novo usando a sintaxe new e assim criamos uma variável do tipo SportCar e igualamos essa variável a um carro que estava dentro de nossa lista, esta ai o motivo por que não precisamos instanciar e sim só referenciamos a um que já estava lá dentro na nossa lista e depois passamos a variável ou objeto do tipo SportCar para a lista através do método remove, e esse método é o que ira remover o carro da marca Volvo da nossa lista.

Para limpar uma lista com vários objetos dentro podemos usar o método Clear, podemos limpar a lista como no exemplo abaixo:

MyCars.Clear();

O método acima limpa todas as instancias de objetos que a lista aceita que por ventura esteja carregada. Como vimos à coleção de genéricos do framework dot net permite dar soluções para eventuais problemas de desenvolvimento de softwares de nosso dia-a-dia. Além disso, os tipos genéricos geralmente excluem a necessidade de construir tipos de coleção personalizados.

Podemos utilizar List<T> em inumeráveis situações no desenvolvimento de software seja desktop ou web uma situação ótima para citar a inclusão de uma Lista seria implementar um carrinho de compras para um sistema de e-commerce.

Espero que tenham gostado deste post, pois em minhas horas de desenvolvimento de software sempre estou utilizando generics, collections entre estes a classe List<T>, sempre para guardar objetos fortemente tipados do projeto em que estou trabalhando.

Até o próximo post.