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


Uma demanda de mercado (por exemplo, uma companhia de petróleo autoriza um projeto para construir uma nova refinaria em resposta a um problema crônico de falta de gasolina)¹
Uma solicitação de um cliente (por exemplo, uma companhia de energia elétrica autoriza um projeto de construção de uma nova subestação para atender a um novo parque industrial);
Um avanço tecnológico (por exemplo, uma empresa de software autoriza um novo projeto para desenvolver uma nova geração de videogames após o lançamento de um novo equipamento para jogos por empresas de produtos eletrônicos).
Uma capacidade de realizar um serviço, como funções de negócios que dão suporte à produção ou à distribuição