Desenvolvimento - C#

List: trabalhando com listas genéricas em C#

Veja neste artigo como utilizar a classe genérica List para trabalhar com coleções de dados no .NET Framework com linguagem C#.

por Joel Rodrigues



Trabalhar com coleções é uma necessidade bastante comum em todos os ambientes de programação. O mais comum, principalmente em linguagens de mais baixo nível, é que se utilize vetores nessas situações.

Vetores, porém, apresentam algumas desvantagens que em alguns casos os tornam opções não tão interessantes. Entre essas desvantagens, podemos citar: a necessidade de se determinar a capacidade do vetor ou de inicializa-lo no momento da declaração; a ausência de métodos para ordenação e filtragem.

Para suprir essa necessidade, o .NET Framework oferece várias classes que representam coleções, cada um com características específicas que as tornam mais interessantes para certas situações. Entre essas classes, uma das mais utilizadas (provavelmente a mais utilizada). Essa classe implementa algumas das principais interfaces de representação de listas do framework: IList, ICollection, IReadOnlyList, IReadOnlyCollection e IEnumerable (incluindo suas versões genéricas).

A class List faz parte do namespace System.Collections.Generic e portanto é também genérica, sendo representada por List<T>, onde T é o tipo dos itens que a coleção irá conter. Esse tipo deve ser definido no momento da declaração da lista, para que o compilador entenda dali pra frente com que tipo de dados irá trabalhar. A seguir veremos como deve ser feita a declaração desse tipo de coleção, bem como seus principais métodos e propriedades.

Declarando listas genéricas

Para utilizar listas genéricas, como já foi dito, é preciso definir o tipo de dados que a coleção irá conter. Na Listagem 1 vemos alguns exemplos de declaração, onde são utilizados vários tipos.

Listagem 1: Declaração de listas genéricas

01 List<string> listaString = new List<string>();
02 List<object> listaObject = new List<object>();
03 List<DateTime> listaDates = new List<DateTime>();

Uma vez declarada, o Visual Studio saberá como lidar com aquela lista, solicitando sempre os itens do tipo que foi definido. Um exemplo disso pode ser visto na Figura 1, onde o intellisense deixa claro qual tipo de dado deve ser inserido na lista (ou seja, a lista é type safe).

Intellisense adequado ao tipo da lista

Figura 1: Intellisense adequado ao tipo da lista

Da mesma forma o intellisense adequa todos os demais métodos e propriedades.

Principais propriedades

  • Capacity: representa o número de elementos que a lista pode suportar sem que precise ser redimensionada. A partir desse número, novos elementos farão com que o compilador aloque mais memória para a lista.
  • Count: retorna (apenas leitura) a quantidade de itens que atualmente existe na lista.
  • Principais métodos
  • A seguir serão citados alguns dos principais métodos da classe List, mas é fundamental que o leitor visite a documentação oficial para conferir a lista completa de métodos, incluindo métodos de extensão.
  • Add(T item): adiciona o parâmetro de tipo T (definido na declaração) no final da lista.
  • AddRange(IEnumerable<T> collection): adiciona todos os itens da coleção que foi passada como parâmetro à lista.
  • Clear(): como o nome sugere, esse método limpa a lista, removendo todos os elementos.
  • Contains(T item): retorna um valor booleano indicando se o item pesquisado existe na lista.
  • Exists(Predicate<T> match): retorna um booleano indicando se existe na lista um item que atenda às condições definidas no predicado.
  • Find(Predicate<T> match): verifica se existe um ou mais itens que atendam à condição definida em match e caso exista, retorna a primeira ocorrência.
  • FindAll(Predicate<T> match): funciona semelhante ao Find, mas retorna uma lista com todos os itens que atendam à condição.
  • ForEach(Action<T> action): executa a ação definida para todos os elementos da lista.
  • Insert(int index, T item): funciona semelhante ao Add, mas insere o item em uma posição definida por index.
  • InsertRange(int index, IEnumerable<T> collection): funciona semelhante ao AddRange, mas insere a nova lista na posição definida por index.
  • Remove(T item): remove o item da lista e retorna um booleano indicando o sucesso da operação. Caso o item não seja encontrado, também retorna false.
  • Sort(): ordena a lista utilizando o comparador padrão do tipo de item contido na lista. Este método também pode receber como parâmetro objetos que definem a forma como a comparação entre os itens deve ser feita.
  • ToArray(): retorna um vetor do tipo contido na lista.

Por ser uma classe bastante flexível, é possível utilizar diversos métodos de extensão e consultas com LINQ e Lambda Expressions.

Exemplo prático

A Listagem 2 apresenta um exemplo prático onde são utilizados alguns dos métodos e propriedades já citados. O exemplo foi desenvolvido em uma Console Application, portanto o código a seguir pode ser copiado diretamente para um novo projeto, caso o leitor deseje testar.

Listagem 2: Utilizando a classe List<T>

static void Main(string[] args)
{
    //Declaração da lista
    List<string> lista = new List<string>();
            
    string opcao = "1";

    while(opcao == "1")
    {
        Console.WriteLine("Digite um nome para inserir na lista:");
        string nome = Console.ReadLine();
        //Adiciona o item à lista
        lista.Add(nome);
        Console.WriteLine("Deseja inserir outro nome? 1-SIM | 2-NÃO");
        opcao = Console.ReadLine();
    }
    //Ordena a lista 
    lista.Sort();
    Console.WriteLine("A lista tem " + lista.Count + " itens:");
    //Imprime cada item da lista
    lista.ForEach(i => Console.WriteLine(i));
}

Como resultado, temos o que é mostrado na Figura 2.

Resultado do exemplo

Figura 2: Resultado do exemplo

Tendo conhecido os principais métodos e propriedades da classe List, que na verdade são herdados das interfaces que ela implementa, o leitor estará apto a trabalhar com várias das demais classes do namespace System.Collections.Generic, uma vez que elas possuem essas interfaces em comum e têm fins semelhantes.

É fundamental que o leitor visite a documentação oficial (link abaixo) para obter maiores detalhes sobre essa e outras classes.

Referências

Documentação oficial MSDN
Joel Rodrigues

Joel Rodrigues - Técnico em Informática - IFRN Cursando Bacharelado em Ciências e Tecnologia - UFRN Programador .NET/C# e Delphi há quase 3 anos, já tendo trabalhado com Webservices, WPF, Windows Phone 7 e ASP.NET, possui ainda conhecimentos em HTML, CSS e Javascript (JQuery).