2012-03-23 3 views
4

Я использую редактор сценариев Windows 7 и PowerGUI для написания ps1. Вот часть моих кодов:неверный цикл foreach для сложного словаря

#In global scope 
$Type_Trans = "System.Collections.Generic.Dictionary[System.String,PSObject]" 
$Type_Farms = "System.Collections.Generic.Dictionary[System.Int32,$Type_Trans]" 

$Dic_Counts = New-Object $Type_Farms 

#...puts some data in $Dic_Counts here... 
#It is no problem with printing out it in console 

#Now call the function below 
Write-Data $Dic_Counts 

Function Write-Data 
{ 
    param(
     $Dic_Counts 
    ) 

    Foreach($Dic_CountsSingle in $Dic_Counts) 
    { 
     Write-DataSingle $Dic_CountsSingle #THIS LINE! 
    } 
} 

Это очень странно здесь: почему Dic_CountsSingle не KeyValuePair, но так же, как Dic_Counts ??

спасибо!

ответ

10

Использование

foreach ($Dic_CountsSingle in $DicCounts.GetEnumerator()) 

Это то же самое для хеш-таблицы в PowerShell, тоже, так что не особенно удивительно.

+0

вы можете объяснить, почему это? –

0

Я думаю, что сломалась здесь:

Foreach($Dic_CountsSingle in $Dic_Counts) 

Это Еогеасп цикл ожидает массив, как это второй аргумент. $ Dic_Counts - хеш-таблица, поэтому она не имеет индекса. Теперь мне интересно, будет ли упорядоченная хеш-таблица работать в цикле foreach. У него есть индекс.

Nope. Foreach также не будет перечислять упорядоченную хеш-таблицу. Должен сделать это сам.

+0

Ну, мне было интересно, что именно PowerShell будет выполнять самостоятельно (либо в 'foreach', либо в конвейере). Он делает это для 'System.Collections.Generic.List ', который, безусловно, не является массивом, но не существует каких-либо определяющих интерфейсов, которые он имеет вместе с массивом, которые не реализованы в словаре или хеш-таблице , – Joey

7

Я делаю это так:

$Dic_Counts.keys | %{ $Dic_Counts[$_] } 
+0

Вау, что это за грамматик? «%»? – bychance

+2

@bychance это псевдоним foreach-object – manojlds

Смежные вопросы