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
- Criamos um
HashSet<int>chamadovistospara rastrear números já encontrados. - Criamos uma
List<int>chamadaunicospara armazenar o resultado na ordem de primeira ocorrência. - Iteramos sobre a lista original.
- Para cada número, chamamos
vistos.Add(n). Se retornartrue, significa que o número não estava no conjunto e foi adicionado; então o adicionamos à listaunicos. - Se retornar
false, o número já foi visto e é ignorado. - Por fim, usamos
string.Joinpara 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
Containsantes deAdd: isso faz duas buscas no conjunto. Prefiraif (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