Saiba como gerenciar coleções de dados usando o tipo de lista genérico

Este tutorial de introdução fornece uma introdução à linguagem C# e os conceitos básicos da classe List<T>.

Pré-requisitos

O tutorial espera que você tenha uma máquina configurada para desenvolvimento local. No Windows, Linux ou macOS, você pode usar a CLI do .NET para criar, criar e executar aplicativos. No Mac e Windows, você pode usar Visual Studio 2019. Para obter instruções de instalação, consulte Configurar seu ambiente local.

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 .NET 6 usam instruções de nível superior. Seu aplicativo pode não corresponder ao código neste artigo, se você já tiver atualizado para as visualizações do .NET 6. Para obter mais informações, consulte o artigo sobre novos modelos C# gerar instruções de nível superior

O SDK do .NET 6 também adiciona um conjunto de diretivas implícitas global 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.

Abra Program.cs em seu editor favorito e substitua o código existente pelo seguinte:

using System;
using System.Collections.Generic;

var names = new List<string> { "<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 todos os CAPS. 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 final 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 seguinte código ao final do 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 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 em sua lista também podem ser classificados. O Sort método classifica todos os itens na lista em sua ordem normal (em ordem alfabética para cadeias de caracteres). Adicione este código à parte inferior do 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 esta aparência:

using System;
using System.Collections.Generic;

WorkWithString();

void WorkWithString()
{
    var names = new List<string> { "<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 programa depois de chamar WorkWithStrings() :

var fibonacciNumbers = new List<int> {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 WorkingWithStrings();. Coloque apenas dois caracteres / na frente da chamada, desta forma: // WorkingWithStrings();.

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.

Você pode saber mais sobre como trabalhar com o List tipo no artigo Conceitos básicos do .NET sobre coleções. Você também aprenderá muitos outros tipos de coleção.