# Communary.PASM

### Functions/Get-Union.ps1

 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 function Get-Union {     <#         .SYNOPSIS             Get the union of two sets.         .DESCRIPTION             This function returns all distinct elements of two sets, also called the union of two sets.         .EXAMPLE             Get-Union (1,10,2,1) (1,2,3)         .EXAMPLE             Get-Union 'John' 'Ronny'         .EXAMPLE             Get-Union 'Jon' 'jon' -CaseSensitive         .LINK             http://en.wikipedia.org/wiki/Union_%28set_theory%29             https://communary.wordpress.com/             https://github.com/gravejester/Communary.PASM         .INPUTS             System.Array             System.String         .NOTES             Author: Øyvind Kallstad             Date: 21.05.2015             Version: 1.0             Dependencies: Get-TypeName     #>     [OutputType([System.Array])]     [CmdletBinding()]     param (         [Parameter(Position = 0, Mandatory = \$true)]         \$Set1,         [Parameter(Position = 1, Mandatory = \$true)]         \$Set2,         # Makes string unions case sensitive.         [Parameter()]         [switch] \$CaseSensitive     )     try {         # if sets are strings, convert to array of chars         if (\$Set1 -is [string]) {             if (-not(\$CaseSensitive)) {                 \$Set1 = \$Set1.ToLowerInvariant()             }             \$Set1 = \$Set1.ToCharArray()         }         if (\$Set2 -is [string]) {             if (-not(\$CaseSensitive)) {                 \$Set2 = \$Set2.ToLowerInvariant()             }             \$Set2 = \$Set2.ToCharArray()         }         # check that the sets are arrays         if (-not(\$set1.GetType().IsArray) -or -not(\$Set2.GetType().IsArray)) {             Write-Warning 'Oops! Input must be arrays!'             break         }         # get the types of the elements in the sets         \$arrayTypesSet1 = Get-TypeName \$Set1         \$arrayTypesSet2 = Get-TypeName \$Set2         # check that the sets do not contain mixed types         if ((\$arrayTypesSet1 -is [array]) -and (\$arrayTypesSet2 -is [array])) {             Write-Warning 'Oops! One, or both, of the sets contain mixed types!'             break         }         # check that the sets contain the same type         if (\$arrayTypesSet1 -ne \$arrayTypesSet2) {             Write-Warning 'Oops! The two sets contain different types!'             break         }         # create hash sets         \$hashSet1 = New-Object System.Collections.Generic.HashSet[\$arrayTypesSet1] (,(\$set1 -as "\$arrayTypesSet1[]"))         \$hashSet2 = New-Object System.Collections.Generic.HashSet[\$arrayTypesSet2] (,(\$set2 -as "\$arrayTypesSet2[]"))         # get the union between them         \$hashSet1.UnionWith(\$hashSet2)         # convert hashset to array and write output to pipeline         \$outputArray = New-Object -TypeName "\$arrayTypesSet1[]" (\$hashSet1.Count)         \$hashSet1.CopyTo(\$outputArray)         Write-Output \$outputArray     }     catch {         Write-Warning \$_.Exception.Message     } }