Group-ObjectFast.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89


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[$_]
                }
            }
        }
    }

}