通过管道反转元素

问题描述 投票:0回答:10

是否有一个函数可以反转通过管道传递的元素?

例如:

PS C:\> 10, 20, 30 | Reverse
30
20
10
arrays powershell reverse
10个回答
25
投票

您可以将函数内的 $input 直接转换为数组,然后反转:

function reverse
{ 
 $arr = @($input)
 [array]::reverse($arr)
 $arr
}

9
投票
10, 20, 30 | Sort-Object -Descending {(++$script:i)}

6
投票

这是一个非常紧凑的解决方案:

function Reverse
{
    [System.Collections.Stack]::new(@($input))
}

2
投票

这是一种方法:

function Reverse ()
{
    $arr = $input | ForEach-Object { $_ }
    [array]::Reverse($arr)
    return $arr
}

2
投票

使用 $input 适用于管道,但不适用于参数。试试这个:

function Get-ReverseArray {
    Param(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeLine = $true)]
        $Array
    )
    begin{
        $build = @()
    }
    process{
        $build += @($Array)
    }
    end{
        [array]::reverse($build)
        $build
    }
}
#set alias to use non-standard verb, not required.. just looks nicer
New-Alias -Name Reverse-Array -Value Get-ReverseArray

测试:

$a = "quick","brown","fox"

#--- these all work 
$a | Reverse-Array
Reverse-Array -Array $a
Reverse-Array $a

#--- Output for each
fox
brown
quick

2
投票
$array = 10,20,30; (($array.Length - 1)..0) | %{ $array[$_] }

1
投票

我意识到这不使用管道,但我发现如果您只想内联执行此操作,这会更容易,有一个简单的方法。只需将您的值放入数组中并调用现有的 Reverse 函数,如下所示:

$list = 30,20,10
[array]::Reverse($list)
# print the output.
$list

将其放入 PowerShell ISE 窗口并运行它,输出将为 10、20、30。

再次强调,如果您只想内联执行此操作。有一个功能适合您。


1
投票

你可以使用

Linq.Enumerable.Reverse
,但这很辛苦。以下工作之一:

,(10, 20, 30) | % { [Linq.Enumerable]::Reverse([int[]]$_) }
,([int[]]10, 20, 30) | % { [Linq.Enumerable]::Reverse($_) }

这两个挑战是将整个数组放入管道中,而不是一次一个元素(通过使其成为带有初始逗号的数组数组来解决)和命中 Reverse 的类型签名(通过

[int[]]
解决)。


0
投票

一句台词的灵感来自于这个答案

[Collections.Stack]$array | Write-Verbose -vb

$array -as 'Collections.Stack' | Write-Verbose -vb

$array | &{ [Collections.Stack]@($Input) } | Write-Verbose -vb

$array | &{ @($Input) -as 'Collections.Stack' } | Write-Verbose -vb

第一个是最短的,第二个看起来最好,最后两个用于在管道中间而不是管道之前执行反转。


-4
投票

尝试:

10, 20, 30 | Sort-Object -Descending
© www.soinside.com 2019 - 2024. All rights reserved.