Question Recherche dans un tableau d'objets.

Plus d'informations
il y a 14 ans 11 mois #8219 par Laurent Dardenne
Mais de cette manière vous ne pouvez obtenir l'index, comme demandé.

J'avais aussi essayé ces types d'approches, avec un filtre :
[code:1]
$T=1..10|% {New-object PSCustomObject -Property @{P1=($_* 2);P2=($_* 3);P3=(\"A\" * $_);P4=(\"B\" * (10-$_))} }

filter Predicate {
if ($_.P1 -eq 10 -and
$_.P2 -eq 15 -and
$_.P3 -eq 'AAAAA' -and
$_.P4 -eq 'BBBBB' )
{ $_ }
}

$T|Predicate
[/code:1]
Un scriptblock pour une clause Where :
[code:1]
$Predicate={
$_.P1 -eq 10 -and
$_.P2 -eq 15 -and
$_.P3 -eq 'AAAAA' -and
$_.P4 -eq 'BBBBB'
}
$T|? $predicate
[/code:1]
Un \"générateur\" de prédicat basé sur une closure renvoyant un scriptblock :
[code:1]
function New-Predicate($P1,$P2,$P3,$P4) {
return {
if ($_.P1 -eq $P1 -and
$_.P2 -eq $P2 -and
$_.P3 -eq $P3 -and
$_.P4 -eq $P4 )
{ return $_ }
}.GetNewClosure();
}
$Predicate1=New-Predicate 10 15 'AAAAA' 'BBBBB'
$T|? $Predicate1
[/code:1]
Mais ici aussi l'index n'est pas récupèré, de plus on parcourt l'intégralité de la collection. D'où la piste des génériques, et paradoxalement c'est la plus simple, car si on veut avoir le même comportement en natif cela devient assez vite verbeux.

La V3 simplifiera peut être l'usage des méthodes génériques...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 11 mois #8222 par christophe
Merci à vous pour vos réponses.
Je vais toutes les tester.

Je dois avouer que la solution proposée par laurent utilisant les génériques m'est complètement inconnue.
Une nouvelle chose à découvrir :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 11 mois #8224 par Jacques Barathon
En effet on ne récupère pas l'index, mais d'expérience, quand on veut récupérer l'index c'est la plupart du temps l'élément du tableau lui-même qu'on veut vraiment récupérer.

Maintenant, si on veut vraiment et uniquement l'index des éléments qui répondent au critère, c'est une fonctionnalité qui n'est pas bien compliquée à ajouter :

[code:1]
# select-index.ps1

param ([String]$text)

$index = 0
@($input) | foreach {
if (($_.psobject.properties | foreach {$_.value} | out-string -stream) -match $text)
{
$index
}
$index++
}
[/code:1]

On peut reprendre les exemples précédents en remplaçant where-text par select-index. Plutôt que les éléments eux-mêmes, le script retournera leur index dans le tableau passé via le pipeline.

Cela dit, je suis d'accord que l'approche avec les génériques est plus puissante dans l'absolu, mais en l'occurrence elle est beaucoup moins intuitive et donc moins facile à s'approprier pour une adaptation à des besoins un peu différents.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.060 secondes
Propulsé par Kunena