更快速地总结哈希表的所有值

时间:2014-12-04 12:13:26

标签: powershell

对哈希表的所有值求和的更快方法是什么?

$a = @{}
$a.Add("Test1",1)
$a.Add("Test2",2)
$a.Add("Test3",3)

预期结果:6

类似的东西,但它不起作用:

$a.GetEnumerator() | %{($_.Value | Measure-Object -Sum).Sum}

我将创建一个包含超过10 000个条目的哈希表,因此我需要更快的方法。

由于

3 个答案:

答案 0 :(得分:2)

Measure-Object的速度是枚举和添加值的两倍。

证明:

PS C:\> $a = @{}
PS C:\> for ($i=1; $i -lt 50000; $i++) { $a["$i"] = (Get-Random) % 5 }
PS C:\> 1..5 | % {
>>   Measure-Command {
>>     $total = 0
>>     $a.GetEnumerator() | % { $total += $_.value }
>>   } | select -Expand TotalMilliseconds
>> }
>>
1075,2542
1081,5379
1082,1324
1074,9834
1076,5663
PS C:\> 1..5 | % {
>>   Measure-Command {
>>     ($a.Values | Measure-Object -Sum).Sum
>>   } | select -Expand TotalMilliseconds
>> }
>>
577,9536
565,8076
579,8534
572,4747
568,8108

答案 1 :(得分:0)

这样的事情会更快,因为你不需要使用GetEnumerator()

($a.Values | Measure-Object -Sum).Sum

如果没有,我认为你可以结合这两个答案的最佳效果

答案 2 :(得分:0)

(measure-command {
$Sum = 0
$a = @{}
$sum += ($a.Test = 1)
$sum += ($a.Test2 = 2)
$sum += ($a.Test3 = 3)
}).TotalMilliseconds


(Measure-Command {
$a = @{}
$a.Add("Test1",1)
$a.Add("Test2",2)
$a.Add("Test3",3)
}).TotalMilliseconds


0.2585
0.4121

第一种方法更快,你可以在流中累积$ sum。