# Communary.PASM

### Functions/Get-Intersection.ps1

 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 function Get-Intersection {     <#         .SYNOPSIS             Get the intersection of two sets.         .DESCRIPTION             In mathematics, the intersection A ∩ B of two sets A and B is the set that             contains all elements of A that also belong to B, but no other elements.         .EXAMPLE             Get-Intersection (1,10,2,1) (1,2,3)         .EXAMPLE             Get-Intersection 'John' 'Ronny'         .EXAMPLE             Get-Intersection 'Jon' 'jon' -CaseSensitive         .LINK             https://en.wikipedia.org/wiki/Intersection_(set_theory)             https://communary.wordpress.com/             https://github.com/gravejester/Communary.PASM         .INPUTS             System.Array             System.String         .NOTES             Author: Øyvind Kallstad             Date: 14.02.2016             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 intersection 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.IntersectWith(\$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     } }