2014-12-04 55 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 

第一種方法是更快,你會得到插播積累$總和。