Question Recherche dans un tableau d'objets.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 14 ans 11 mois #8219
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Recherche dans un tableau d'objets.
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...
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.
- christophe
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 2
- Remerciements reçus 0
il y a 14 ans 11 mois #8222
par christophe
Réponse de christophe sur le sujet Re:Recherche dans un tableau d'objets.
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
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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 14 ans 11 mois #8224
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Recherche dans un tableau d'objets.
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.
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Recherche dans un tableau d'objets.