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
Veja neste artigo como utilizar a classe genérica List
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).
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.
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.