2015-10-16 74 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