2012-03-14 2 views
0

Я знаю, что Ruby имеет метод map!, который делает это. В PowerShell в настоящее время я сделал то, что я сделал:Каков наилучший способ перебора массива и изменения элементов в PowerShell?

$new_array = @(); 
$array | % { 
    $new_array += <do something with the currently element $)>; 
} 
$array = $new_array; 

Я хочу знать, как наилучшим образом это сделать. Благодаря!

ответ

6

Простейшее Я могу думать о

$array | %{ $_ + 1 } 

$_ + 1 является преобразование я хочу.

Так что вы можете сделать:

$new = $array | %{$_ + 1} 

или

$array = $array | %{ $_ + 1} 

PS: Вы можете определить функцию карты, если вы хотите:

function map ([scriptblock]$script, [array] $a) { 

    $a | %{ & $script $_ } 

} 

map {param($i) $i + 1} 1,2,3 

или написать метод расширения на Sy stem.Array: http://blogs.msdn.com/b/powershell/archive/2008/09/06/hate-add-member-powershell-s-adaptive-type-system.aspx

+0

Также '$ anonymousFunc = {$ _ * 3}' и '1,2,3 | % $ anonymousFunc' – stej

0

Вы также можете использовать фильтр:

$arr = 1,2,3 

filter addone {$_ +1} 
$arr | addone 

Или функцию фильтрации:

function addone {process{$_ +1}} 
$arr | addone 

Или анонимный фильтр:

$addone = {$_ +1} 
$addone.isfilter = $true 
$arr | &$addone 

Edit: дни работы анонимного фильтра могут быть пронумерованы. В бета-версии V3, которая больше не работает, и я подозреваю, что это не изменится. Кажется, что блоки скриптов скомпилированы сразу после их создания, а свойство .isfilter не может быть изменено после их компиляции.

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