场景
昨天晚上有群友问如何在PowerShell的管道中获取前一个元素。管道的优势和关注点在于从管道中流过的当前元素,但是为什么要去看前一个元素呢?我就设想一个场景吧:“给定一个数组集合,要求输出每个元素和它前面元素的乘积”。
这个问题用For循环解决,没有任何难度。但是该群友想用ForEach-Object来解决,因为他觉得Foreach-Object速度比For循环快(并非绝对如此),于是乎就会引出该话题:从 ForEach-Object的管道中获取前一个元素。
方案
我能想到的是引入一个中间变量每次把当前元素保存起来,下一次先处理,然后再更新这个元素,比如。
$temp=0 1..10 | foreach { $temp * $_ $temp=$_ }
输出为:
0 2 6 12 20 30 42 56 72 90
史瑞克兄,也给出了另外一个方法,关键点在于数组的Array.IndexOf(value)方法,可以获取当前元素所在的索引,然后减一即为前一个元素。这在数组中任意两个元素不相同的情况下有效。但是假如数组样本很大,在里面搜索一个元素,时间复杂度为N,最终时间复杂度会变成N平方,也是稍微有点性能问题的。
本文链接: https://www.pstips.net/get-previous-element-from-pipeline.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
$temp=0
1..10 | foreach {
$temp * $_
$temp=$_
}
这里面的foreach 是 自动变成了foreach-Object的意思了吗?
这时候python 中的enumerate就显出了用场