
Tengo una lista de dígitos, algunos secuenciales, otros con saltos. Aquí hay un ejemplo.
(1..10),12,15,(30..45),50,53
Cuando intento consultar si "mi número" está en esta lista (digamos que sí) 4
, todas las comprobaciones fallan.
> 4 -in (1..10),12,15,(30..45),50,53
> False
> (1..10),12,15,(30..45),50,53 -contains 4
> False
> ((1..10),12,15,(30..45),50,53).contains(4)
> False
> (1..10),12,15,(30..45),50,53
> 1
2
3
4
etc...
¿Qué estoy haciendo mal?
Respuesta1
El comportamiento predeterminado de Powershell con comas es crear matrices de matrices:
(1..10),12,15,(30..45),50,53 | Foreach {$_ -join ' '}
1 2 3 4 5 6 7 8 9 10
12
15
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
50
53
4
no es igual a 1 2 3 4...
, por lo que la comparación es falsa.
Una forma sencilla de obtener lo que busca expresando $()
los elementos de la lista separados por punto y coma en lugar de coma, como:
$((1..10);12;15;(30..45);50;53) -contains 4
True
Palabras clave similares desenvuelven o aplanan una lista/matriz
Respuesta2
GraciasJeff Zeitlin. La solución es "aplanar" la matriz. En mi caso, la forma más fácil y compatible de hacer esto era canalizar la salida write-output
y luego verificarla.
> ((1..10),12,15,(30..45),50,53 | write-output) -contains 4
> True
Respuesta3
Existe una sintaxis simple para aplanar una colección de matrices en una sola matriz:
4 -in @((1..10),12,15,(30..45),50,53 | ForEach-Object {$_})