quarta-feira, 5 de outubro de 2016

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.
" A mente que se abre a uma nova ideia jamais voltará ao seu tamanho original." Albert Einstein

Nenhum comentário:

Postar um comentário