2014-12-04 57 views
0

总结散列表的所有值的更快方法是什么?总结散列表的所有值的更快方法

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

预期结果:6

类似的东西,但它不工作:

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

我去,所以我需要更快的创造超过10 000个条目的哈希表办法。

感谢

回答

1

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
0

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

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

如果不是这样,我想你可以结合两者的答案在这里

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 

第一种方法是更快,你会得到插播积累$总和。