最简洁的方法来搜索密钥

时间:2015-10-16 13:39:25

标签: powershell powershell-v3.0

假设:

$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 是一种更好的方法吗?

4 个答案:

答案 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