Médio C#

Removendo duplicatas com HashSet

Enunciado

Dada uma lista de números inteiros com duplicatas, use um HashSet<int> para criar uma nova lista sem repetições, mantendo a ordem original de primeira ocorrência. Imprima a lista resultante.

Requisitos

  • Usar HashSet<int> para controlar quais números já foram vistos.
  • Preservar a ordem da primeira ocorrência na lista original.
  • Imprimir os números únicos separados por vírgula.

Código inicial

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var numeros = new List<int> { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
        // Seu código aqui
    }
}

Saída esperada

3, 1, 4, 5, 9, 2, 6
Ver dica

Crie um HashSet<int> para armazenar os vistos e uma lista para o resultado. Para cada número, se vistos.Add(numero) retornar true, adicione-o à lista de resultado.

Mostrar solução
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var numeros = new List<int> { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };
        var vistos = new HashSet<int>();
        var unicos = new List<int>();

        foreach (int n in numeros)
        {
            // Add retorna true se o elemento foi inserido (não existia)
            if (vistos.Add(n))
            {
                unicos.Add(n);
            }
        }

        Console.WriteLine(string.Join(", ", unicos));
    }
}

Passo a passo

  1. Criamos um HashSet<int> chamado vistos para rastrear números já encontrados.
  2. Criamos uma List<int> chamada unicos para armazenar o resultado na ordem de primeira ocorrência.
  3. Iteramos sobre a lista original.
  4. Para cada número, chamamos vistos.Add(n). Se retornar true, significa que o número não estava no conjunto e foi adicionado; então o adicionamos à lista unicos.
  5. Se retornar false, o número já foi visto e é ignorado.
  6. Por fim, usamos string.Join para imprimir os números separados por vírgula.

Por que funciona

O HashSet oferece verificação de pertinência em tempo constante médio. Ao usar Add, que retorna um booleano indicando se o elemento foi inserido, conseguimos filtrar duplicatas sem uma segunda estrutura de busca. A lista preserva a ordem, enquanto o conjunto cuida da unicidade.

Erros comuns

  • Usar Contains antes de Add: isso faz duas buscas no conjunto. Prefira if (vistos.Add(n)).
  • Esquecer de adicionar à lista: apenas adicionar ao HashSet não preserva a ordem; é preciso adicionar à lista também.
  • Modificar a coleção durante a iteração: não modifique a lista original enquanto itera sobre ela; use uma nova lista.

Outra forma de resolver

Poderia usar LINQ: numeros.Distinct().ToList(). É mais conciso, mas internamente usa um HashSet. A versão manual é mais didática e mostra o funcionamento.

Saída esperada

3, 1, 4, 5, 9, 2, 6