Saiba como gerir coleções de dados com a Lista<T> em C#
Este tutorial introdutório fornece uma introdução à linguagem C# e às noções básicas da List<T> classe.
Pré-requisitos
O tutorial espera que tenha uma máquina configurada para desenvolvimento local. Consulte Configurar o ambiente local para obter instruções de instalação e uma descrição geral do desenvolvimento de aplicações no .NET.
Se preferir executar o código sem ter de configurar um ambiente local, veja a versão interativa no browser deste tutorial.
Um exemplo de lista básica
Crie um diretório com o nome list-tutorial. Torne-o no diretório atual e execute dotnet new console
.
Importante
Os modelos C# para .NET 6 utilizam instruções de nível superior. A aplicação poderá não corresponder ao código neste artigo, se já tiver atualizado para o .NET 6. Para obter mais informações, veja o artigo sobre Novos modelos C# gerar instruções de nível superior
O SDK .NET 6 também adiciona um conjunto de diretivas implícitasglobal using
para projetos que utilizam os seguintes SDKs:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Estas diretivas implícitas global using
incluem os espaços de nomes mais comuns para o tipo de projeto.
Para obter mais informações, consulte o artigo sobre Diretivas de utilização implícita
Abra Program.cs no 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. Guarde Program.cs. Escreva dotnet run
na janela da consola para experimentá-la.
Criou uma lista de cadeias, adicionou três nomes a essa lista e imprimiu os nomes em todas as CAPS. Está a utilizar conceitos que aprendeu em tutoriais anteriores para percorrer a lista.
O código para apresentar nomes utiliza a funcionalidade de interpolação de cadeias . Quando precede um string
com o $
caráter, pode incorporar código C# na declaração de cadeia. A cadeia real substitui esse código C# pelo valor que gera. Neste exemplo, substitui o {name.ToUpper()}
por cada nome, convertido em letras maiúsculas, porque chamou o ToUpper método.
Vamos continuar a explorar.
Modificar conteúdo da lista
A coleção que criou utiliza o List<T> tipo. Este tipo armazena sequências de elementos. Especifique o tipo de elementos entre os parênteses angulares.
Um aspeto importante deste List<T> tipo é que pode crescer ou encolher, permitindo-lhe adicionar ou remover elementos. Adicione este código no final do programa:
Console.WriteLine();
names.Add("Maria");
names.Add("Bill");
names.Remove("Ana");
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Adicionou mais dois nomes ao final da lista. Também removeu uma. Guarde o ficheiro e escreva dotnet run
para o experimentar.
Permite-lhe List<T> também referenciar itens individuais por índice . Coloca o índice entre [
tokens e ]
a seguir ao nome da lista. C# utiliza 0 para o primeiro índice. Adicione este código diretamente abaixo do código que acabou de adicionar e experimente:
Console.WriteLine($"My name is {names[0]}");
Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");
Não pode aceder a um índice para além do fim da lista. Lembre-se de que os índices começam em 0, pelo que o maior índice válido é um menor do que o número de itens na lista. Pode verificar durante quanto tempo a lista está a utilizar a Count propriedade. Adicione o seguinte código no final do programa:
Console.WriteLine($"The list has {names.Count} people in it");
Guarde o ficheiro e dotnet run
escreva novamente para ver os resultados.
Procurar e ordenar listas
Os nossos exemplos utilizam listas relativamente pequenas, mas as suas aplicações podem muitas vezes criar listas com muitos mais elementos, por vezes numeração de milhares. Para encontrar elementos nestas coleções maiores, tem de procurar na lista itens diferentes. O IndexOf método procura um item e devolve o índice do item. Se o item não estiver na lista, IndexOf
devolve -1
. Adicione este código à parte inferior do 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 na sua lista também podem ser ordenados. O Sort método ordena todos os itens na lista pela ordem normal (alfabeticamente para cadeias). Adicione este código à parte inferior do programa:
names.Sort();
foreach (var name in names)
{
Console.WriteLine($"Hello {name.ToUpper()}!");
}
Guarde o ficheiro e escreva dotnet run
para experimentar esta versão mais recente.
Antes de iniciar a secção seguinte, vamos mover o código atual para um método separado. Isto torna mais fácil começar a trabalhar com um novo exemplo. Coloque todo o código que escreveu num novo método chamado WorkWithStrings()
. Chame esse método na parte superior do seu programa. Quando terminar, o código deverá ter o seguinte aspeto:
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
Tem utilizado o string
tipo de listas até agora. Vamos criar um List<T> tipo diferente. Vamos criar um conjunto de números.
Adicione o seguinte ao seu programa depois de ligar WorkWithStrings()
para :
List<int> fibonacciNumbers = [1, 1];
Isto cria uma lista de números inteiros e define os dois primeiros números inteiros para 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 ao obter 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);
}
Guarde o ficheiro e escreva dotnet run
para ver os resultados.
Dica
Para se concentrar apenas nesta secção, pode comentar o código que chama WorkWithStrings();
. Basta colocar dois /
carateres à frente da chamada desta forma: // WorkWithStrings();
.
Desafio
Veja se consegue reunir alguns dos conceitos desta e das lições anteriores. Expanda o que criou até agora com Números Fibonacci. Tente escrever o código para gerar os primeiros 20 números na sequência. (Como uma sugestão, o 20º número Fibonacci é 6765.)
Desafio concluído
Pode ver uma solução de exemplo ao analisar o código de exemplo concluído no GitHub.
Com cada iteração do ciclo, está a utilizar os dois últimos números inteiros na lista, somando-os e adicionando esse valor à lista. O ciclo repete-se até adicionar 20 itens à lista.
Parabéns, concluiu o tutorial da lista. Pode continuar com tutoriais adicionais no seu próprio ambiente de desenvolvimento.
Pode saber mais sobre como trabalhar com o List
tipo no artigo de noções básicas do .NET sobre coleções. Também irá saber mais sobre muitos outros tipos de coleção.