No PowerShell eu tenho uma lista de hashtables. Usei um Where()
método para selecionar uma das tabelas hash da lista porque li que Where()
é mais rápido que Where-Object
. No entanto, quando tento operar na tabela hash selecionada, descubro que ela foi convertida em uma coleção pelo Where()
método. Não consigo convertê-lo em uma tabela hash.
Existe alguma maneira de fazer com que o Where()
método retorne uma tabela hash em vez de uma coleção?
Se for necessário, posso usar Where-Object
o que retorna uma tabela hash. No entanto, prefiro continuar Where()
se houver uma solução alternativa simples.
Algum código de demonstração:
Clear-Host
[System.Object[]]$SqlServers = @(
@{
key="L";
connectionString="Server=(localdb)\\mssqllocaldb;Database=Test;Trusted_Connection=yes;";
},
@{
key="D";
connectionString="Server=DEV.DEV.LOCAL;Database=Test;Trusted_Connection=yes;";
}
)
$UserSelection = 'L'
$selectedServerDetails = $SqlServers.Where({$_.key -eq $UserSelection})
$selectedServerDetails2 = $SqlServers | Where-Object{$_.key -eq $UserSelection}
$selectedServerDetails3 = ($selectedServerDetails -as [hashtable])
$selectedServerDetails.GetType().FullName
$selectedServerDetails2.GetType().FullName
if ($selectedServerDetails3 -eq $null) { '$selectedServerDetails3 is null' } else { $selectedServerDetails3.GetType().FullName }
O que resulta em:
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
System.Collections.Hashtable
$selectedServerDetails3 is null
A propósito, tentei alterar o tipo de dados $SqlServers
para [hashtable[]]$SqlServers
. Não fez diferença.
Ao contrário do cmdlet , o método intrínseco sempre retorna uma coleção — mesmo que apenas um elemento da coleção de entrada corresponda .
Where-Object
.Where()
Como um aparte: Ao contrário de
Where-Object
,.Where()
oferece uma otimização por meio de seu segundo parâmetro opcional: provoca'First'
um curto-circuito na filtragem retornando imediatamente assim que a primeira correspondência for encontrada - esta otimização é aplicada abaixo.A infeliz assimetria de
Where-Object
não oferecer o mesmo curto-circuito é o assunto da solicitação de recurso na edição #13834 do GitHub .Além disso, cada elemento correspondente é envolto em um invólucro quase invisível
[psobject]
.[psobject]
Infelizmente, há casos em que esse wrapper que pretende ser um detalhe de implementação invisível causa uma diferença no comportamento - consulte o problema nº 5579 do GitHub .Portanto, basta usar a indexação para extrair o (único) elemento correspondente, ou seja
[0]
:Para descartar possíveis efeitos colaterais do
[psobject]
wrapper invisível, use a propriedade intrínsecapsobject
, por meio da.BaseObject
propriedade, para extrair o objeto .NET empacotado: