Private/Functions/Group-ObjectFast.ps1

# Module: TeamsFunctions
# Function: Private Function for Testing purposes
# Author: Dr. Tobias Weltner / PowerShellOne
# Updated: N/A
# Status: Unmanaged




function Group-ObjectFast {
  [CmdletBinding(DefaultParameterSetName = 'Analysis')]
  [OutputType('System.Collections.Hashtable')]
  param
  (
    [Parameter(Mandatory)]
    [string[]]
    $Property,

    [Parameter(ParameterSetName = 'Analysis')]
    [Switch]
    $NoElement,

    [Parameter(ParameterSetName = 'Separation')]
    [Switch]
    $AsHashtable,

    [Parameter(ParameterSetName = 'Separation')]
    [Switch]
    $AsString,

    [Parameter(Mandatory, ValueFromPipeline)]
    [object]
    $InputObject
  )

  begin {
    # create an empty hashtable
    $hashtable = @{}
  }


  process {
    # calculate the unique key based on the properties
    # submitted by the user
    if ($AsString -or $PSCmdlet.ParameterSetName -eq 'Analysis') {
      $key = $(foreach ($_ in $Property) { $InputObject.$_ }) -join ','
    }
    else {
      $key = foreach ($_ in $Property) { $InputObject.$_ }
    }

    # check to see if the key is present already
    if ($hashtable.ContainsKey($key) -eq $false) {
      # add an empty array list
      $hashtable[$key] = [Collections.Arraylist]@()
    }

    # add element to appropriate array list:
    $null = $hashtable[$key].Add($InputObject)
  }

  end {
    if ($AsHashtable) {
      return $hashtable
    }
    elseif ($NoElement) {
      foreach ($_ in $hashtable.Keys) {
        [PSCustomObject]@{
          Count = $hashtable[$_].Count
          Name  = $key
        }
      }
    }
    else {
      foreach ($_ in $hashtable.Keys) {
        [PSCustomObject]@{
          Count = $hashtable[$_].Count
          Name  = $key
          Group = $hashtable[$_]
        }
      }
    }
  }

}