🐆

“多次元配列(リテラル配列)”と“ジャグ配列”の要素数を取得する方法”

2023/12/15に公開

概要

こちらの記事でFunctionの引数に多次元配列(リテラル配列)の変数を使用しました。
Functionでfor文で繰り返し処理を行うため、多次元配列にある1次元目の要素数を取得しようと、
変数名.Length変数名.Count 」で確認すると配列内にあるすべての要素数を取得してしまいました。

ネットで調べても見つからずBing AIに質問した結果、取得する方法が「"変数名".GetLength("対象の次元数")」という事がわかりました。

実際のコマンド結果 や ジャグ配列 での方法も合わせて詳しく紹介します。

なお、この記事で記載する多次元配列とは、カンマ(,)を使ったリテラル配列の事を指しています。

この記事のターゲット

  • PowerShellユーザーの方
  • 多次元配列で次元ごとの要素数を取得したい方
  • ついでにジャグ配列(多段階配列)についても知りたい方

要素数の取得方法

多次元配列の場合

1次元目の要素数を取得する場合は GetLength カッコ内の引数を「0」に指定する事で取得可能です。

コピー用
"変数名".GetLength("対象の次元数")

なお、2次元配列で2次元目の要素数を取得する場合は「1」を指定。

実際の例(多次元配列)

多次元配列で要素数を取得
# 多次元配列の変数を宣言
PS C:\Users\"ユーザー名"> $multidimensional_array = New-Object "System.String[,]" 4,2
>> $multidimensional_array[0,0] = 'localhost'
>> $multidimensional_array[0,1] = '8080'
>> $multidimensional_array[1,0] = 'localhost'
>> $multidimensional_array[1,1] = '8000'
>> $multidimensional_array[2,0] = 'google.com'
>> $multidimensional_array[2,1] = '443'
>> $multidimensional_array[3,0] = 'smtp.google.com'
>> $multidimensional_array[3,1] = '25'
PS C:\Users\"ユーザー名">

# 1次元目の要素数を取得
PS C:\Users\"ユーザー名"> $multidimensional_array.GetLength(0)
4
PS C:\Users\"ユーザー名">

# 2次元目の要素数を取得
PS C:\Users\"ユーザー名"> $multidimensional_array.GetLength(1)
2
PS C:\Users\"ユーザー名">

# 3次元目の指定すると存在しない次元の為、エラーが発生
PS C:\Users\"ユーザー名"> $multidimensional_array.GetLength(2)
MethodInvocationException: Exception calling "GetLength" with "1" argument(s): "Array does not have that many dimensions."
PS C:\Users\"ユーザー名">

ジャグ配列の場合

ついでにジャグ配列についても。

要素数を取得する場合は変数の後ろに .Length(または.Count)を指定する事で取得できます。

1次元目の要素数を取得する場合は、

コピー用
"変数名".Length

2次元目の場合は、

コピー用
"変数名"[0].Length

3次元目以降も中括弧([])を増やしていく形式となります。
なお、ジャグ配列の場合、存在しない次元数を指定してもエラーが発生しません。そのため、取り扱いには注意が必要です。

コピー用
"変数名"[0][0].Length

実際の例(ジャグ配列)

2次元のジャグ配列を使った例
# ジャグ配列で変数を宣言
PS C:\Users\"ユーザー名"> [System.String[][]]$jagged_array = @(
>>     @('localhost','8080'),
>>     @('localhost','8000'),
>>     @('google.com','443'),
>>     @('smtp.google.com','25')
>> )
PS C:\Users\"ユーザー名">

# 1次元目の要素数を取得
PS C:\Users\"ユーザー名"> $jagged_array.Length
4
PS C:\Users\"ユーザー名">

# 2次元目の要素数を取得
PS C:\Users\"ユーザー名"> $jagged_array[0].Length
2
PS C:\Users\"ユーザー名">

# 存在しない3次元目を指定しても結果が返る
# また、Lengthプロパティ と Countプロパティ の結果にも差異がある
## Lengthプロパティを指定
PS C:\Users\"ユーザー名"> $jagged_array[0][0].Length
9
PS C:\Users\"ユーザー名">
## Countプロパティを指定
PS C:\Users\"ユーザー名"> $jagged_array[0][0].Count
1
PS C:\Users\"ユーザー名">

イメージが付きにくいと思うので、3次元のジャグ配列を宣言した場合は以下の通りとなります。
上記、2次元配列のジャグ配列ではLengthプロパティを使ったので、ここではCountプロパティを使ってみます。

3次元のジャグ配列を使った例
# ジャグ配列で変数を宣言
PS C:\Users\"ユーザー名"> $3d_array = @(
>>     @(
>>         @('one'),
>>         @('two')
>>     ),
>>     @(
>>         @('three'),
>>         @('four')
>>     ),
>>     @(
>>         @('five'),
>>         @('six')
>>     )
>> )
PS C:\Users\"ユーザー名">

# 1次元目の要素数を取得
PS C:\Users\"ユーザー名"> $3d_array.Count
3
PS C:\Users\"ユーザー名">

# 2次元目の要素数を取得
PS C:\Users\"ユーザー名"> $3d_array[0].Count
2
PS C:\Users\"ユーザー名">

# 3次元目の要素数を取得
PS C:\Users\"ユーザー名"> $3d_array[0][0].Count
1
PS C:\Users\"ユーザー名">

# 存在しない4次元目を指定しても結果が返る
PS C:\Users\"ユーザー名"> $3d_array[0][0][0].Count
1
PS C:\Users\"ユーザー名">

参考情報

まとめ

  • 多次元配列(リテラル配列)の要素数を取得する場合
    "変数名".GetLength("対象の次元数")
  • ジャグ配列の要素数を取得する場合
    Countプロパティでも確認可能。また、存在しない次元数を指定してもエラーは出ず結果が返ってくるので取り扱い注意!
    • 1次元目の要素数
      "変数名".Length
    • 2次元目の要素数
      "変数名"[0].Length
    • 3次元目の要素数
      "変数名"[0][0].Length
    • 3次元目以降
      同じように変数名の後ろの中括弧([])を追加していく形式となる。

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion