PowerShell - 連続していない範囲の数値のチェックが失敗する

PowerShell - 連続していない範囲の数値のチェックが失敗する

数字のリストがあります。いくつかは連続しており、いくつかは区切りがあります。次に例を示します。
(1..10),12,15,(30..45),50,53

「私の番号」がこのリストに含まれているかどうかを照会しようとすると、含まれていると仮定すると4、すべてのチェックが失敗します。

> 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...

何が間違っているのでしょうか?

答え1

Powershell のカンマを使用したデフォルトの動作は、配列の配列を作成することです。

(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は と等しくない1 2 3 4...ので、比較は false になります。


探しているものを取得する簡単な方法の 1 つは、$()リスト要素をコンマではなくセミコロンで区切って表現することです。

$((1..10);12;15;(30..45);50;53) -contains 4

True

同様のキーワードは、リスト/配列のアンラップまたはフラット化です。

答え2

ありがとうジェフ・ザイトリン解決策は、配列を「フラット化」することです。私の場合、これを行う最も簡単で互換性のある方法は、出力をパイプしてwrite-output、それをチェックすることでした。

> ((1..10),12,15,(30..45),50,53 | write-output) -contains 4
> True

答え3

配列のコレクションを 1 つの配列にフラット化する簡単な構文があります。

4 -in @((1..10),12,15,(30..45),50,53 | ForEach-Object {$_})

関連情報