get-topN.ps1

function Get-TopN {
    Param(
            [parameter(
                ValueFromPipeLine=$true
            )]
            [string]
        $InputObject
        ,
            [int]
        $Top = 10
    )

    Begin {
        $h = @{}
    }

    Process {
        $h[$InputObject]++
    }

    End {
        $h.GetEnumerator() |
            Sort-Object -Property Value -Descending |
            Select-Object -First $top
    }
}

#for testing only

<#
'neli', 'yks', 'kaks', 'yks', 'kolm', 'yks', 'kaks', 'yks' |
    get-topN -top 2
#>


<#
function Get-TopNOld {
    Param(
            [parameter(
                Mandatory=$true,
                Position=0
            )]
            [hashtable]
        $InputObject,
            [int]
        $top = 10
    )
 
# $arr = New-Object object[] $InputObject.keys.count
# $InputObject.CopyTo($arr,0)
# $arr |
    $InputObject.GetEnumerator() |
# Select-Object -Property Name, Value |
        Sort-Object -Property Value -Descending |
        Select-Object -First $top
 
}
 
$h = @{}
'neli', 'yks', 'kaks', 'yks', 'kolm', 'yks', 'kaks', 'yks' |
    ForEach-Object { $h[$_]++ }
 
Get-TopNOld -InputObject $h -top 2
#>