Tutorial de coleções C# com exemplos

⚡ Resumo Inteligente

Em C#, as coleções oferecem uma maneira flexível de armazenar e gerenciar grupos de objetos. Ao contrário dos arrays, as coleções crescem e diminuem de tamanho em tempo de execução, e os namespaces System.Collections e System.Collections.Generic fornecem tipos prontos para listas, dicionários, pilhas e filas.

  • 🔃 Dimensionamento dinâmico: As coleções adicionam e removem elementos em tempo de execução, portanto, você não define o tamanho antecipadamente como em um array.
  • 📚 Espaços de nomes: System.Collections contém os tipos não genéricos, enquanto System.Collections.Generic contém os tipos genéricos com segurança de tipo.
  • 🧱 Aulas principais: ArrayList, Stack, Queue, Hashtable, SortedList e BitArray atendem às necessidades comuns não genéricas.
  • Potência genérica: List, Dictionary, HashSet e Queue adicionam segurança de tipo em tempo de compilação e melhor desempenho.
  • 🔑 Escolha certa: Utilize um dicionário para pesquisas por chave, uma lista para itens ordenados e uma pilha ou fila para ordenação LIFO ou FIFO.
  • 🤖 Assistência de IA: O GitHub Copilot cria a estrutura do código da coleção, e os pipelines do ML.NET passam os dados por meio de tipos de coleção genéricos.

Coleções em C#

Em nosso tutorial anterior, aprendemos como podemos usar arrays em C#. Vamos ter uma rápida visão geral disso. Arrays na programação são usados ​​para agrupar um conjunto de objetos relacionados. Portanto, pode-se criar um array ou um conjunto de inteiros, que pode ser acessado através de um nome de variável.

O que são coleções em C#?

As coleções são semelhantes a Arrays, fornece uma maneira mais flexível de trabalhar com um grupo de objetos.

Em arrays, você deve ter notado que precisa definir previamente o número de elementos em um array. Isso teve que ser feito quando o array foi declarado.

Mas em uma coleção, você não precisa definir previamente o tamanho da coleção. Você pode adicionar elementos ou até mesmo remover elementos da coleção a qualquer momento. Este capítulo se concentrará em como podemos trabalhar com as diferentes coleções disponíveis em C#.

Classes System.Collections

O .NET Framework agrupa as classes de coleção originais não genéricas dentro do namespace System.Collections. A tabela abaixo resume os principais tipos que você pode usar imediatamente.

Coleção Descrição
Lista de Matriz A coleção ArrayList é semelhante aos Arrays tipo de dados em C#. A maior diferença é a natureza dinâmica da coleção da lista de arrays.
CorMonitor A pilha é um caso especial de coleção que representa o conceito de último a entrar, primeiro a sair (LIFO, na sigla em inglês).
filas A fila é uma coleção de casos especiais que representa o conceito de "primeiro a entrar, primeiro a sair".
Tabela de hash Uma tabela hash é uma coleção especial usada para armazenar itens de chave-valor.
Lista Ordenada O SortedList é uma coleção que armazena pares de valores-chave em ordem crescente de chave por padrão.
BitArray Uma matriz de bits é uma matriz de estrutura de dados que armazena bits.

Coleções Genéricas em C#

As classes não genéricas acima armazenam cada elemento como um objeto genérico, o que significa que o compilador não consegue verificar o tipo e o programa paga um pequeno custo pela conversão de valores para um tipo específico. Para resolver isso, o C# adicionou o namespace System.Collections.Generic, onde cada coleção é vinculada a um tipo declarado.

Uma coleção genérica como uma lista Aceita apenas strings, portanto, os erros são detectados em tempo de compilação e nenhuma conversão de tipo é necessária ao ler um item de volta. Isso torna as coleções genéricas mais seguras, rápidas e fáceis de ler, razão pela qual são a escolha padrão no código C# moderno.

As coleções genéricas mais comuns estão listadas abaixo:

  • Lista : Uma lista redimensionável baseada em índices, o substituto genérico para ArrayList.
  • Dicionário : Armazena pares de chave-valor com pesquisas rápidas baseadas em hash.
  • Conjunto de hashes : Armazena apenas valores únicos e suporta operações de conjunto, como união.
  • Fila : Uma coleção FIFO (primeiro a entrar, primeiro a sair), a versão genérica de uma fila.
  • Pilha : Uma coleção do tipo "último a entrar, primeiro a sair", a versão genérica do Stack.
  • Lista ordenada : Mantém os pares chave-valor classificados por chave em ordem crescente.

Exemplo de coleção de listas em C#

A lista é a coleção genérica mais utilizada porque se comporta como um array dinâmico. O exemplo abaixo cria uma lista de strings, adiciona e remove itens, lê seu tamanho e, em seguida, imprime os valores restantes. Todo o código está escrito no arquivo Program.cs.

Passo 1) Importe o namespace System.Collections.Generic e declare uma lista de strings.

Passo 2) Adicione itens com o método Add e exclua um com o método Remove.

Passo 3) Leia a propriedade Count e, em seguida, percorra a lista com uma instrução foreach.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code Explicação:-

  1. O namespace System.Collections.Generic foi importado para que o tipo List esteja disponível para o programa.
  2. Uma nova lista Um diretório chamado "tutoriais" é criado e três nomes são adicionados com o método Add.
  3. O método Remove exclui o valor “Python”, o que deixa dois itens na lista.
  4. A propriedade Count retorna o número de itens, e o loop foreach imprime cada valor restante em ordem.

Quando o programa é executado, ele primeiro imprime a contagem de 2, Seguido por Java e Kotlin em linhas separadas. Isso mostra como uma coleção altera seu tamanho em tempo de execução, algo que um array fixo não pode fazer.

Diferença entre Arrays e Collections em C#

Ambos um ordem e uma coleção agrupa itens relacionados sob um mesmo nome, mas eles se comportam de maneira diferente quando o programa está em execução. Saber quando usar cada um ajuda a escrever um código mais limpo e eficiente.

As principais diferenças estão listadas abaixo:

  • Tamanho Um array tem um tamanho fixo definido na declaração, enquanto uma coleção pode crescer ou diminuir a qualquer momento.
  • Manipulação de tipos: Um array armazena um único tipo, enquanto uma coleção pode ser segura em relação a tipos com genéricos ou conter objetos de tipos mistos quando não é genérica.
  • Localização: Os arrays são elementos nativos da linguagem, enquanto as classes de coleção residem nos namespaces System.Collections e System.Collections.Generic.
  • Operações integradas: As coleções oferecem métodos prontos para adicionar, remover, pesquisar e classificar itens, enquanto os arrays fornecem apenas acesso indexado básico.
  • Melhor uso: Escolha um array quando o número de itens for conhecido e fixo, e uma coleção quando a contagem mudar durante a execução do programa.

Resumindo, os arrays são mais adequados para dados de tamanho fixo, enquanto as coleções oferecem a flexibilidade que a maioria das aplicações do mundo real necessita.

Perguntas Frequentes

Use um dicionário quando precisar de buscas rápidas por uma chave única, como um ID associado a um registro. Ele encontra valores em tempo quase constante, enquanto uma lista precisa examinar os itens um por um.

HashSet e Dictionary oferecem as buscas mais rápidas porque utilizam hashing para acessar um elemento em tempo quase constante. Uma List ou um array são mais lentos porque podem precisar verificar cada elemento em sequência.

As coleções concorrentes residem no namespace System.Collections.Concurrent e são projetadas para código multithread. Tipos como ConcurrentDictionary e BlockingCollection permitem que várias threads adicionem e removam itens com segurança, sem a necessidade de bloqueios manuais.

IEnumerable é a interface base que suporta apenas a leitura de itens com um loop foreach. ICollection a estende e adiciona membros como Count, Add e Remove, permitindo também a modificação da coleção.

List é uma coleção genérica e com tipagem estática que armazena um único tipo declarado, proporcionando verificações em tempo de compilação e melhor desempenho. ArrayList não é genérico e armazena cada item como um objeto, o que exige conversão de tipo e permite tipos mistos.

Uma pilha (Stack) funciona com a ordem de último a entrar, primeiro a sair (LIFO), portanto, o item mais recente é removido primeiro usando a função Pop. Uma fila (Queue) funciona com a ordem de primeiro a entrar, primeiro a sair (FIFO), portanto, o item mais antigo é removido primeiro usando a função Dequeue.

Sim. O GitHub Copilot pode sugerir o tipo de coleção correto, gerar loops que adicionam ou filtram itens e completar consultas LINQ a partir de um breve comentário, o que agiliza o trabalho com listas, dicionários e outras coleções.

O ML.NET fornece dados de treinamento por meio de coleções como List e IEnumerable, que são mapeadas para seu pipeline IDataView. Armazenar amostras em uma coleção genérica fortemente tipada mantém o fluxo de trabalho de aprendizado de máquina claro e seguro em relação aos tipos.

Resuma esta postagem com: