Group-ObjectFast.ps1



function Group-ObjectFast
{
    [CmdletBinding(DefaultParameterSetName='Analysis')]
    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[$_]
                }
            }
        }
    }

}