2015-10-16 18 views
3

假设最简洁的方式:搜索哈希表的数组,一个关键

$columnArray = @(
    @{Name='COL_A';Type=[int];[email protected]()}, 
    @{Name='COL_B';Type=[string];[email protected]()}, 
    @{Name='COL_C';Type=[datetime];[email protected]()} 
) 

使用Where-Object命令得到COL_BMeasurements数组:

($Fields | ? { $_.Name -eq 'COL_B' }).Measurements 

是否有更多 - 简洁的方式做到这一点?一套嵌套的PSCustomObject是更好的方法吗?

+2

为什么不-property标志的对象'$ columnHashtable = @ {为col_a = @ {类型= [INT];三围= @()}; COL_B = @ {类型= [字符串];三围= @()}; COL_C = @ {类型= [日期时间];三围= @()}}'?你可以这样做:'$ columnHashtable.COL_B.Measurements'。 – PetSerAl

+0

'$ columnArray | %{New-Object PSObject -property $ _} | ? {$ _。名称-eq'COL_B'} |选择度量--ExpandProperty度量' –

+1

@DaveSexton'Select -ExpandProperty Measurements' – Matt

回答

2

如果您有兴趣通过按键查找元素,那么比Hashtable会比阵列更好。

[email protected]{ 
    [email protected]{Type=[int];[email protected]()} 
    [email protected]{Type=[string];[email protected]()} 
    [email protected]{Type=[datetime];[email protected]()} 
} 

随着Hashtable你可以通过这个命令得到Measurements阵列的COL_B

$columnHashtable.COL_B.Measurements 

,如果你想枚举所有元素Hashtable,那么你可以使用下面的命令:

$columnHashtable.GetEnumerator()|ForEach-Object ... 

如果散列表中元素的顺序很重要,则可以使用[ordered]运算符之前散列表文字创建OrderedDictionary而不是Hashtable

3

您可以修改阵列本身的方法做的发现:

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

如果采取这种做法:

$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 

你也可以把你正在使用填充在$信息数据的任何功能。

$results = Import-CSV C:\Results.csv 

$items = Foreach ($item in $results) { 
    $thisItem = [PSCustomObject]@{ 
    Name = $_.name 
    Size = $_.size 
    Date = $_.date 
    } 
    $thisItem 
} 
0

如何:

$columnArray | % {New-Object PSObject -property $_} | ? {$_.Name -eq 'COL_B'} | Select -ExpandProperty Measurements 

它在阵列中的每个元素转换为使用它省去了明确定义对象或使用Add-Member