Question [Fonction]Itération de collection en parallèle

Plus d'informations
il y a 17 ans 2 semaines #4239 par Laurent Dardenne
Si vous avez une correspondance à effectuer entre 2 tableaux la fonction suivante vous permettra de parcourir en paralléle ces 2 tableaux ou collections de type différent.
L'usage de l'interface IEnumerator (itérateur .NET) permet d'adresser 2 collections de type différent, un des intérêts du concept d'interface en POO :
[code:1]
Function Itere([System.Collections.IEnumerator] $Source,
[System.Collections.IEnumerator] $Destination,
[ScriptBlock] $Traitement,
[switch] $Strict) {
#Itération parallèle sur 2 collections
#Les interfaces $Source et $Destination proviennent des instances de collections à traiter.
#$Traitement contient le code du traitement à effectuer sur chaque élément d'une ou des collections ( principe du foncteur sans utiliser de délégué)
#Strict indique si l'itération échoue ou pas si les deux collections ne sont pas de taille égale.

trap {}
$ErrorMessage=\"{0} `\"La collection {1} ne contient pas le même nombre d'éléments que la collection {2}`\"\"
if ($Strict)
{$Action=\"Throw\"} #Déclenche une exception
else
{$Action=\"Write-Warning\"} #Affiche un Warning sur la console

While ($Source.MoveNext() -eq $True)
{
[void]$Destination.MoveNext()
#La fin de l'itération sur la collection de destinatation est-elle déjà atteinte ?
if ($Destination.Current -ne $null )
{ &$Traitement}
else
{ Invoke-Expression ($ErrorMessage -F $Action,\"Destination\",\"Source\"«») }
} #While. La Fin de la collection Source est atteinte

#Reste-t-il des éléments à parcourir pour l'itérateur de la collection de destinatation?
[void]$Destination.MoveNext()
if ($Destination.Current -ne $null )
{ Invoke-Expression ($ErrorMessage -F $Action,\"Source\",\"Destination\"«»)}
}#itere

$Traitement = { $Src=$Source.Current
$Dest=$Destination.Current
\"Copie {0} vers {1}\" -F $Src,$Dest
}
[/code:1]
Quelques tests :

[code:1]
$Source=1..5
$Destination=\"a\",\"b\",\"c\",\"d\",\"e\"
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement

$Source=1..4
$Destination=\"a\",\"b\",\"c\",\"d\",\"e\"
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement

$Source=1..4
$Destination=\"a\",\"b\",\"c\"
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement -Strict

$Source=@()
$Destination=\"a\",\"b\",\"c\"
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement -Strict

$Source=1..4
$Destination=@()
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement -Strict

$Source=@()
$Destination=@()
Itere $Source.GetEnumerator() $Destination.GetEnumerator() $Traitement
[/code:1]

Message édité par: Laurent Dardenne, à: 3/03/09 13:28<br><br>Message édité par: Laurent Dardenne, à: 5/04/17 12:47

Tutoriels PowerShell

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

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