假设:
$columnArray = @(
@{Name='COL_A';Type=[int];Measurements=@()},
@{Name='COL_B';Type=[string];Measurements=@()},
@{Name='COL_C';Type=[datetime];Measurements=@()}
)
使用Where-Object
命令获取COL_B
的{{1}}数组:
Measurements
有更简洁的方法吗?嵌套的($Fields | ? { $_.Name -eq 'COL_B' }).Measurements
是一种更好的方法吗?
答案 0 :(得分:4)
您可以使用一种方法修改数组本身:
Add-Member -InputObject $columnArray -MemberType ScriptMethod -Name FindCol -Value { param([String]$Column) $this | ? { $_.Name -eq $Column } }
然后你可以这样做:
$columnArray.FindCol('COL_B').Measurements
或者你可以这样做:
Add-Member -InputObject $columnArray -MemberType ScriptMethod -Name GetMeasurements -Value { param([String]$Column) $this | ? { $_.Name -eq $Column } | Select-Object -ExpandProperty Measurements }
然后:
$columnArray.GetMeasurements('COL_B')
答案 1 :(得分:2)
如果您有兴趣按键查找元素,那么Hashtable
将比数组更好。
$columnHashtable=@{
COL_A=@{Type=[int];Measurements=@()}
COL_B=@{Type=[string];Measurements=@()}
COL_C=@{Type=[datetime];Measurements=@()}
}
使用Hashtable
,您可以通过此命令获取Measurements
数组COL_B
:
$columnHashtable.COL_B.Measurements
如果要枚举Hashtable
中的所有元素,则可以使用以下命令:
$columnHashtable.GetEnumerator()|ForEach-Object ...
如果哈希表中元素的顺序很重要,您可以在哈希表文字之前使用[ordered]
运算符来创建OrderedDictionary
而不是Hashtable
。
答案 2 :(得分:1)
如果采用这种方法:
$Info = [PSCustomObject]@{
Name = "MyFieldName"
Size = 15
Date = Get-Date
}
然后这些都有效:
$Info | Select Name, Size
$Info | Where ($_.date -gt (Get-Date).AddDays(-1))
$Info | Sort Size -Descending | Select -First 1
您还可以使用您正在使用的任何功能来填充$ Info。
中的数据$results = Import-CSV C:\Results.csv
$items = Foreach ($item in $results) {
$thisItem = [PSCustomObject]@{
Name = $_.name
Size = $_.size
Date = $_.date
}
$thisItem
}
答案 3 :(得分:0)
这个怎么样:
$columnArray | % {New-Object PSObject -property $_} | ? {$_.Name -eq 'COL_B'} | Select -ExpandProperty Measurements
它使用-property
标志将数组的每个元素转换为对象,从而节省了必须明确定义对象或使用Add-Member