2015-06-01 28 views
1

我有一個散列表,它的值是int和string(有時是字符串數組)對象的混合值。我想將它們都轉換爲字符串,但我不知道一個簡單的方法來做到這一點,而不需要「重建」哈希表,將每個值轉換爲字符串。有沒有更容易,更有效的方式來做到這一點,而無需循環的值?原地轉換Hashtable值

這是一個簡單的例子。這是我將要轉換的哈希:

PS C:\Users\me> $test | Select -ExpandProperty Values | % { $_.GetType() } 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 
True  True  String         System.Object 
True  True  String         System.Object 
True  True  Int32         System.ValueType 
True  True  Int32         System.ValueType 
True  True  Int32         System.ValueType 

要這樣:

PS C:\Users\gross> $new_test | Select -ExpandProperty Values | % { $_.GetType() } 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 
True  True  String         System.Object 
True  True  String         System.Object 
True  True  String         System.Object 
True  True  String         System.Object 
True  True  String         System.Object 

回答

1

我不認爲有一個「更有效」的方式來改變值。您可以將每個鍵的值設置爲新類型的值($hash[$key] = $hash[$key].ToString()),但如果您正在循環因爲您要更改枚舉對象而變得複雜。

您可以通過確保您通過副本哈希表的鍵列舉解決這個問題在哈克的方式,但後來修改與哈希:

$hash = @{ 
    a = '1' 
    b = 2 
    c = 3 
    d = '4' 
    e = 5 
} 

Write-Host "`nBefore:`n" 

$hash.Values | ForEach-Object { $_.GetType() } 

$keys = [Array]::CreateInstance([String], $hash.Keys.Count) 
$hash.Keys.CopyTo($keys, 0) | Out-Null 


$keys | ForEach-Object { 
    $hash[$_] = $hash[$_].ToString() 
} 

Write-Host "`nAfter:`n" 

$hash.Values | ForEach-Object { $_.GetType() } 

但說實話,我覺得它更容易只是做一個新的:

$hash = @{ 
    a = '1' 
    b = 2 
    c = 3 
    d = '4' 
    e = 5 
} 

Write-Host "`nBefore (`$hash):`n" 

$hash.Values | ForEach-Object { $_.GetType() } 

$newhash = @{} 
$hash.Keys | ForEach-Object { $newhash[$_] = $hash[$_].ToString() } 

Write-Host "`nAfter (`$newhash):`n" 

$newhash.Values | ForEach-Object { $_.GetType() } 
1

他們鑄造成字符串應該足夠了:

$($new_test.Keys) | % { $new_test[$key] = [string]$new_test[$key] } 

,或者如果你不」(想要不加區分地施加所有的值):

($new_test.Keys | ? { $new_test[$_] -is [int] }) | 
    % { $new_test[$key] = [string]$new_test[$key] } 
+0

我想類似的東西,得到了'同時通過集合枚舉時出現錯誤:集合已修改;枚舉操作可能不會執行。「,因此我的答案。我錯過了什麼? – briantist

+1

您需要展開子表達式中的鍵以從改變散列表中解耦。 –

+0

啊,明白了。我最終以迂迴的方式創建了一個新陣列。子表達式更清晰。 – briantist