从 ForEach-Object的管道中获取前一个元素 2


场景

昨天晚上有群友问如何在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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

2 条评论 “从 ForEach-Object的管道中获取前一个元素