HashSet<T> Class
O C# possui um tipo de coleção denominada HashSet<T>. Um Sets é uma coleção não ordenada sem itens duplicado, funciona de maneira similar a uma lista, mas oferece operações de conjunto matemático como União e Interseção.
O conceito Sets vem da matemática. Pense num conjunto de gênero (fêmea e macho) , o conjunto de dias da semana, o conjunto de variações do triangulo. Diferente de conjuntos matemáticos os conjuntos em C# não podem ser infinitos , mas podem ser tão amplos quanto a memoria disponível.
Como Dicionários, sets são implementados usando tabelas hash. Sets são tipos de dicionários com chaves mas sem valores , fazendo com que eles tenham formas de lista.
Para criar um HashSet<T>, você pode fazer isso:
HashSet<int> pequenosNumeros = new HashSet<int>();
pequenosNumeros .Add(2);
pequenosNumeros .Add(3);
Ou, mais conveniente , você pode adicionar usando um inicializador de coleção:
HashSet<int> pequenosNumeros = new HashSet<int>{2 ,3 , 5, 7, 11, 13};
Ou você pode criar um conjunto a partir de uma coleção existente:
List<int> intList = new List<int>{0 ,1 ,2 , 3 ,4 ,5 ,6 ,7 8 , 9 ,10};
HAshSet <int> numeros = new HasSet<int>(intList);
Se você tentar adicionar u elemento que já existe no HashSet , exemplo:
pequenosNumeros .Add(2);
... o copilador não trata coo erro o método Add(), devolve verdadeiro se ocorreu a inclusão e falso se não houve alteração no conjunto.
Veremos um exemplo utilizando um importante método, o UnionWhit(). Esse método faz a união de coleções sem duplicar elementos.
Abra o console do Visual Studio e faça você o teste.
List<string> colors = new List<string> { "vermelho", "amarelo", "laranja" };
string[] maisCores = { "laranja","amarelo","verde","azul","violeta"};
//Adiciona a primeira coleção ao HashSet
HashSet<string> cobinando = new HashSet<string>(colors);
// Utilizando o método UnionWith()
cobinando.UnionWith(maisCores);
// Exibindo as cores sem duplicação
foreach (var item in cobinando)
{
Console.WriteLine(item);
}
O outro método interessante que o HashSet possui é o IntersectWith(); que dá a você os itens sobrepostos entre duas coleções, observe o código abaixo:
Console.WriteLine("Buscando a sobreposição em duas listas");
List<string> CandidatosPresidencia = new List<string> { "Clinton", "Eduard", "Obama" ,"McCain","Giuliani"};
string[] senadores = { "Alexader", "Boxer", "Clinton", "Eduard", "Obama" ,"Snowe"};
//Adiciona a primeira coleção ao HashSet
HashSet<string> trabalhaSenado = new HashSet<string>(CandidatosPresidencia);
// Utilizando o método IntersectWith()
trabalhaSenado.IntersectWith(senadores);
// Exibindo as condidatos que se repetem
foreach (var item in trabalhaSenado)
{
Console.WriteLine(item);
}
Console.ReadKey();
E ainda existe a possibilidade de fazer de forma contrária, remove os elementos que estejam duplicados em ambas as listas com o método EXcepWith();
Console.WriteLine("Removendo as exceções em duas listas");
Queue<int> unicos = new Queue<int>( new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10});
HashSet <int> impares = new HashSet<int> {1, 3, 5, 7, 9, 11};
// Utilizando o método ExceptWith()
impares.ExceptWith(impares);
// Exibindo os numeros que não se repetem
foreach (var item in impares)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
Obs: Veja a documentação deste tipo de coleção no link, Microsoft.
O outro método interessante que o HashSet possui é o IntersectWith(); que dá a você os itens sobrepostos entre duas coleções, observe o código abaixo:
Console.WriteLine("Buscando a sobreposição em duas listas");
List<string> CandidatosPresidencia = new List<string> { "Clinton", "Eduard", "Obama" ,"McCain","Giuliani"};
string[] senadores = { "Alexader", "Boxer", "Clinton", "Eduard", "Obama" ,"Snowe"};
//Adiciona a primeira coleção ao HashSet
HashSet<string> trabalhaSenado = new HashSet<string>(CandidatosPresidencia);
// Utilizando o método IntersectWith()
trabalhaSenado.IntersectWith(senadores);
// Exibindo as condidatos que se repetem
foreach (var item in trabalhaSenado)
{
Console.WriteLine(item);
}
Console.ReadKey();
E ainda existe a possibilidade de fazer de forma contrária, remove os elementos que estejam duplicados em ambas as listas com o método EXcepWith();
Console.WriteLine("Removendo as exceções em duas listas");
Queue<int> unicos = new Queue<int>( new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10});
HashSet <int> impares = new HashSet<int> {1, 3, 5, 7, 9, 11};
// Utilizando o método ExceptWith()
impares.ExceptWith(impares);
// Exibindo os numeros que não se repetem
foreach (var item in impares)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
Obs: Veja a documentação deste tipo de coleção no link, Microsoft.
" A mente que se abre a uma nova ideia jamais voltará ao seu tamanho original." Albert Einstein