如何整理哈希表中的值并将它们转换为百分比?

How can I collate values from a hashtable and turn them into percentages?

在 PowerShell 中,我正在生成哈希表,其中键的值为整数,但这需要转换为相对于其他键值对的百分比。考虑以下哈希表:

这里一共有4个键值对。但是,只有 QuestionSet1ARL 的值不是 0。因此我想报告 QuestionSet1ARL 的值为 100%。下面是一个略有不同的示例:

此处,QuestionSetTrustQuestionSet4 的值为 5。因此它们占哈希表中值的 50%。如果 QuestionSetTrust 的值为 2,QuestionSet4 的值为 1,则百分比分别为 66% 和 33%。

我认为我需要创建一个辅助哈希表 (enabledSurveys) 来执行此操作(仅包含值大于 0 的键值对。为此,我编写了一个简单的循环:

foreach ($survey in $initialSurveys.Keys) { 
        # Set the ratio variable equal to the value from the hashtable. For ease of reading.
        $surveyRatio = $initialSurveys.$survey
        if ($surveyRatio -gt 0) {
            $enabledSurveys.add($survey, $surveyRatio)
        }
    }

我想我需要对这些值求和以获得总数,然后从每个键中导出 contributedTotal。在我继续之前,有没有更直观的方法来推导出这些信息而不需要第二个哈希表?

最佳结果:

需要这些值的总和才能确定百分比。

$InitialSurveys = @{
    'QuestionSetTrust' = 1
    'QuestionSet4' = 5
}
$Total = 0
foreach ($Key in $InitialSurveys.Keys) {
    $Total += $InitialSurveys[$Key]
}
$ResultHash = @{}
foreach ($Key in $InitialSurveys.Keys) {
    $ResultHash[$Key] = "{0}%" -f "$([math]::Round(($InitialSurveys[$Key] / $Total * 100.0), 2))"
}
$ResultHash

补充 , this is a slightly different approach, using the Measure-Object command to calculate the total sum and using hashtable's .GetEnumerator() 方法以迭代其 key/value 对。

$InitialSurveys = @{
    QuestionSetTrust = 2
    QuestionSet4 = 1
}

$Total = ($InitialSurveys.GetEnumerator() | Measure-Object Value -Sum).Sum

$Result = @{}
$InitialSurveys.GetEnumerator().ForEach{
    $Result[ $_.Key ] = $_.Value * 100 / $Total
}

$Result | Format-Table Key, @{ n='Value'; e={ '{0}%' -f ([math]::Round($_.Value)) } }

为了计算百分比值,使用 intrinsic method .ForEach{} 而不是 ForEach-Objectforeach。它应该比 ForEach-Object 更快并且比 foreach( $item in $collection ).

更简洁

最后我们使用 Format-Table's ability to provide a custom format by defining a calculated propertyValue 列进行舍入并在输出中添加 % 符号。这样我们就可以在 $Result 哈希表中保留准确的数值,以便进一步计算并减少内存使用。

输出:

Name                           Value
----                           -----
QuestionSet4                   33%  
QuestionSetTrust               67%