J'ai un tableau d'objets de la structure suivante:
structure Disk
{
int UID;
String Computer;
}
Un ordinateur peut avoir un tas de disques partagés et un disque peut être partagé entre des ordinateurs.
Je veux découvrir tous les disques communs à tous les ordinateurs. Par exemple, j'ai l'ordinateur A, B et C; Disques 1, 2 et 3. La matrice de disques est {1, A}, {1, B}, {2, A}, {2, B}, {2, C}, {3, A}. Le résultat que je veux devrait être le disque 2, car il apparaît sur A, B et C.
Existe-t-il un moyen efficace d'y parvenir?
Avec plusieurs boucles foreach, c'est réalisable, mais je veux certainement une meilleure façon. Je pense à des opérations comme l'intersection, mais je n'ai pas trouvé cela dans PowerShell.
En supposant $arr
est le tableau, vous pouvez faire comme ceci:
$computers = $arr | select -expand computer -unique
$arr | group uid | ?{$_.count -eq $computers.count} | select name
En général, j'aborderais l'union et l'intersection à Powershell comme ceci:
$a = (1,2,3,4)
$b = (1,3,4,5)
$a + $b | select -uniq #union
$a | ?{$b -contains $_} #intersection
Mais pour ce que vous demandez, la solution ci-dessus fonctionne bien et pas vraiment sur l'union et l'intersection dans la définition standard des termes.
Mise à jour:
J'ai écrit pslinq qui fournit Union-List
et Intersect-List
qui aident à réaliser l'union et l'intersection définies avec Powershell.
Vous pouvez aussi faire
$a = (1,2,3,4)
$b = (1,3,4,5)
Compare-Object $a $b -PassThru -IncludeEqual # union
Compare-Object $a $b -PassThru -IncludeEqual -ExcludeDifferent # intersection
Ne fonctionne pas si $a
est cependant nul.
Pour la soustraction d'ensemble (a - b):
$a | ?{-not ($b -contains $_)}
Bien que cela ne fonctionne pas dans les premières versions, dans les versions plus récentes, vous pouvez simplement appeler directement les fonctions d'extension .NET LINQ, par exemple.
[system.linq.enumerable]::union([object[]](1,2,3),[object[]](2,3,4))
(Sans la conversion en un type énumérable, PowerShell génère une erreur "impossible de trouver une surcharge".)
Cela fonctionne certainement dans PowerShell V4 et V5 et certainement pas dans V2. Je n'ai pas de système sous la main avec V3.