Saiba como gerenciar coletas de dados usando List<T> em C #
Este tutorial de introdução fornece uma introdução à linguagem C# e os conceitos básicos da classe List<T>.
Pré-requisitos
Este tutorial espera que você tenha um computador configurado para desenvolvimento local. Consulte Configurar seu ambiente local para obter instruções de instalação e uma visão geral do desenvolvimento de aplicativos no .NET.
Se você preferir executar o código sem precisar configurar um ambiente local, consulte a versão interativa no navegador deste tutorial.
Um exemplo de lista básica
Crie um diretório chamado list-tutorial. Torne-o o diretório atual e execute dotnet new console
.
Importante
Os modelos C# para o .NET 6 usam instruções de nível superior. Se você já tiver atualizado para o .NET 6, talvez seu aplicativo não corresponda ao código descrito neste artigo. Para obter mais informações, consulte o artigo sobre Novos modelos C# geram instruções de nível superior
O SDK do .NET 6 também adiciona um conjunto de diretivas implícitasglobal using
para projetos que usam os seguintes SDKs:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Essas diretivas implícitas global using
incluem os namespaces mais comuns para o tipo de projeto.
Para obter mais informações, consulte o artigo sobre Diretivas de uso implícito
Abra Program.cs em seu editor favorito e substitua o código existente pelo seguinte:
List<string> names = ["<name>", "Ana", "Felipe"];
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Substitua <name>
pelo seu nome. Salve o Program.cs. Digite dotnet run
na janela de console para testá-lo.
Você criou uma lista de cadeias de caracteres, adicionou três nomes a essa lista e imprimiu os nomes em MAIÚSCULAS. Você está usando conceitos que aprendeu em tutoriais anteriores para executar um loop pela lista.
O código para exibir nomes utiliza o recurso de interpolação de cadeia de caracteres. Quando você precede um string
com o caractere $
, pode inserir o código C# na declaração da cadeia de caracteres. A cadeia de caracteres real substitui esse código C# pelo valor gerado. Neste exemplo, ela substitui o {name.ToUpper()}
por cada nome, convertido em letras maiúsculas, pois você chamou o método ToUpper.
Vamos continuar explorando.
Modificar conteúdo da lista
A coleção que você criou usa o tipo List<T>. Esse tipo armazena sequências de elementos. Especifique o tipo dos elementos entre os colchetes.
Um aspecto importante desse tipo List<T> é que ele pode aumentar ou diminuir, permitindo que você adicione ou remova elementos. Adicione este código ao final do programa:
Console.WriteLine();
names.Add("Maria");
names.Add("Bill");
names.Remove("Ana");
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Você adicionou mais dois nomes ao final da lista. Também removeu um. Salve o arquivo e digite dotnet run
para testá-lo.
O List<T> também permite fazer referência a itens individuais por índice. Coloque o índice entre os tokens [
e ]
após o nome da lista. C# usa 0 para o primeiro índice. Adicione este código diretamente abaixo do código que você acabou de adicionar e teste-o:
Console.WriteLine($"My name is {names[0]}");
Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");
Você não pode acessar um índice além do fim da lista. Lembre-se de que os índices começam com 0, portanto, o maior índice válido é uma unidade a menos do que o número de itens na lista. Você pode verificar há quanto tempo a lista está usando a propriedade Count. Adicione o código a seguir ao final de seu programa:
Console.WriteLine($"The list has {names.Count} people in it");
Salve o arquivo e digite dotnet run
novamente para ver os resultados.
Pesquisar e classificar listas
Nossos exemplos usam listas relativamente pequenas, mas seus aplicativos podem criar listas com muitos outros elementos, chegando, às vezes, a milhares. Para localizar elementos nessas coleções maiores, pesquise por itens diferentes na lista. O método IndexOf procura um item e retorna o índice do item. Se o item não estiver na lista, IndexOf
retornará -1
. Adicione este código à parte inferior de seu programa:
var index = names.IndexOf("Felipe");
if (index == -1)
{
Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
Console.WriteLine($"The name {names[index]} is at index {index}");
}
index = names.IndexOf("Not Found");
if (index == -1)
{
Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
Console.WriteLine($"The name {names[index]} is at index {index}");
}
Os itens em sua lista também podem ser classificados. O método Sort classifica todos os itens na lista na ordem normal (em ordem alfabética para cadeias de caracteres). Adicione este código à parte inferior de seu programa:
names.Sort();
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Salve o arquivo e digite dotnet run
para experimentar a versão mais recente.
Antes de iniciar a próxima seção, vamos passar o código atual para um método separado. Isso facilita o começo do trabalho com um exemplo novo. Coloque todo o código que você escreveu em um novo método chamado WorkWithStrings()
. Chame esse método na parte superior do programa. Quando você terminar, seu código deverá ter a seguinte aparência:
WorkWithStrings();
void WorkWithStrings()
{
List<string> names = ["<name>", "Ana", "Felipe"];
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Console.WriteLine();
names.Add("Maria");
names.Add("Bill");
names.Remove("Ana");
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Console.WriteLine($"My name is {names[0]}");
Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");
Console.WriteLine($"The list has {names.Count} people in it");
var index = names.IndexOf("Felipe");
if (index == -1)
{
Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
Console.WriteLine($"The name {names[index]} is at index {index}");
}
index = names.IndexOf("Not Found");
if (index == -1)
{
Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
Console.WriteLine($"The name {names[index]} is at index {index}");
}
names.Sort();
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
}
Listas de outros tipos
Você usou o tipo string
nas listas até o momento. Vamos fazer List<T> usar um tipo diferente. Vamos compilar um conjunto de números.
Adicione o seguinte ao seu programa depois de chamar WorkWithStrings()
:
List<int> fibonacciNumbers = [1, 1];
Isso cria uma lista de números inteiros e define os primeiros dois inteiros como o valor 1. Estes são os dois primeiros valores de uma sequência Fibonacci, uma sequência de números. Cada número Fibonacci seguinte é encontrado considerando a soma dos dois números anteriores. Adicione este código:
var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
fibonacciNumbers.Add(previous + previous2);
foreach (var item in fibonacciNumbers)
{
Console.WriteLine(item);
}
Salve o arquivo e digite dotnet run
para ver os resultados.
Dica
Para se concentrar apenas nesta seção, comente o código que chama WorkWithStrings();
. Coloque apenas dois caracteres /
na frente da chamada, desta forma: // WorkWithStrings();
.
Desafio
Veja se você consegue combinar alguns dos conceitos desta lição e de lições anteriores. Expanda o que você compilou até o momento com números Fibonacci. Tente escrever o código para gerar os 20 primeiros números na sequência. (Como uma dica, o vigésimo número Fibonacci é 6765.)
Desafio concluído
Veja um exemplo de solução analisando o código de exemplo finalizado no GitHub.
Com cada iteração do loop, você está pegando os últimos dois inteiros na lista, somando-os e adicionando esse valor à lista. O loop será repetido até que você tenha adicionado 20 itens à lista.
Parabéns, você concluiu o tutorial de lista. Você pode continuar com tutoriais adicionais em seu próprio ambiente de desenvolvimento.
Saiba mais sobre como trabalhar com o tipo List
no artigo Noções básicas do .NET em coleções. Você também aprenderá muitos outros tipos de coleção.