Arrays 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

我有一个非常基本的PowerShell数组:$TestArray,有两个文本列:Price和TimeStamp(这是我获取它们的方式,对此无需做任何事情):

我希望,在单个PowerShell行中添加一个四舍五入的
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
    中,尽管代价是必须计算每次访问的值
answer提供了一个基于
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)) 
}