Arrays powershell阵列添加成员-寻找优雅的代码
我有一个非常基本的PowerShell数组:$TestArray,有两个文本列:Price和TimeStamp(这是我获取它们的方式,对此无需做任何事情): 我希望,在单个PowerShell行中添加一个四舍五入的Arrays powershell阵列添加成员-寻找优雅的代码,arrays,powershell,pipeline,Arrays,Powershell,Pipeline,我有一个非常基本的PowerShell数组:$TestArray,有两个文本列:Price和TimeStamp(这是我获取它们的方式,对此无需做任何事情): 我希望,在单个PowerShell行中添加一个四舍五入的Time2值 $Time2 = [math]::Round($TestArray.TimeStamp) 我想到的代码是: $TestArray | Add-Member -Name Time2 -MemberType NoteProperty -Value { [math]::Ro
Time2
值
$Time2 = [math]::Round($TestArray.TimeStamp)
我想到的代码是:
$TestArray | Add-Member -Name Time2 -MemberType NoteProperty -Value { [math]::Round($Table.TimeStamp) }
当然,我可以做ForEach循环;这将很容易处理,但我希望在这一行代码中实现这一点
有什么想法吗
干杯,
Philippe将成员类型更改为
ScriptProperty
,并将单个数组项引用为$this
:
$TestArray |Add-Member Time2 -Value { [math]::Round($this.Timestamp) } -MemberType ScriptProperty
值得注意的是,在此示例中,管道本身充当一个
foreach
循环,分解数组并将每个单独的项绑定到Add Member
,或者,您也可以使用Select Object
和一个自定义属性实现相同的功能:
$TestArray | Select-Object *,@{ n='Time2';e={ [math]::Round($_.TimeStamp) }}
通过创建脚本属性(类型ScriptProperty
),从封闭对象的.TimeStamp
属性动态计算其值,可以直接解决您的问题
- 这种方法的优点是,即使以后对
的更改也会正确地反映在.TimeStamp
中,尽管代价是必须计算每次访问的值.Time2
Select Object
的替代方案,可以创建静态注释属性(键入NoteProperty
),就像您最初尝试的那样
- 这种方法的优点是,您只需花费一次计算成本,但以后对
的更改将不会反映在
中.Time2
要提供更快的PSv5+替代方案(每个方法调用一个,分散在多行以提高可读性),请执行以下操作: 上述解决方案使用PSv4+
.ForEach()
收集方法和PSv5+static::new()
type方法调用构造函数
最后,我们是一个班轮公司: 以下
foreach
基于循环的note属性解决方案也可以解决您的问题,而且速度更快;虽然为了便于阅读,它被分散在多行中,但它也可以作为一行:
foreach ($el in $TestArray) {
Add-Member -InputObject $el -Name Time2 -MemberType NoteProperty `
-Value ([math]::Round($el.TimeStamp))
}
通常,虽然管道通常支持更优雅的单命令解决方案,但不幸的是,这是以牺牲性能为代价的。我曾尝试使用$this,但没有将-MemberType更改为ScriptProperty!为什么需要单行代码?[皱眉]foreach循环通常比使用管道的任何循环都快。节省代码长度以增加进一步维护的清晰度(在本例中,在现实生活中,我没有性能问题,我总共节省了1整页代码)感谢这一原理。这是错误的,但没关系。查看mklement0发布的代码,彻底驳斥“太长”。至于可维护性。。。与简单的管道相比,清楚地铺设台阶更易于维护。//尽管如此,正如我爸爸所说,“如果我们都是一样的,这个世界会很无聊!”曼纽尔(咧嘴笑)说得很清楚,也很有用。最后,我将使用您的最后一种选择,因为我需要对时间戳值进行进一步的比较和数学计算,因此最好将其作为静态NoteProperty类型。
# ScriptProperty - dynamic
$TestArray.ForEach({
$_.psobject.properties.Add(
[psscriptproperty]::new('Time2', { [math]::Round($this.TimeStamp) })
)
})
# NoteProperty - static
$TestArray.ForEach({
$_.psobject.properties.Add(
[psnoteproperty]::new('Time2', [math]::Round($_.TimeStamp))
)
})
foreach ($el in $TestArray) {
Add-Member -InputObject $el -Name Time2 -MemberType NoteProperty `
-Value ([math]::Round($el.TimeStamp))
}