“多次元配列”と“ジャグ配列”の要素数を取得する方法”
概要
こちらの記事で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
実際の例(ジャグ配列)
# ジャグ配列で変数を宣言
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プロパティを使ってみます。
# ジャグ配列で変数を宣言
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\"ユーザー名">
参考情報
-
Microsoft公式ドキュメント:ジャグ配列 と リテラル配列(記事内だと“真の多次元配列”と記載) について解説あり
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_arrays#rank
https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-09 -
Microsoft公式ドキュメント:GetLengthメソッド
https://learn.microsoft.com/en-us/powershell/scripting/lang-spec/chapter-04#432-arraysMember Member Kind Type Purpose Length Instance Property (read-only) int Number of elements in the array Rank Instance Property (read-only) int Number of dimensions in the array Copy Static Method void/see Purpose column Copies a range of elements from one array to another. There are four versions, where source
is the source array,destination
is the destination array,count
is the number of elements to copy, andsourceIndex
anddestinationIndex
are the starting locations in their respective arrays:
Copy(source, destination, int count)
Copy(source, destination, long count)
Copy(source, sourceIndex, destination, destinationIndex, int count)
Copy(source, sourceIndex, destination, destinationIndex, long count)GetLength Instance Method (read-only) int/none Number of elements in a given dimension
GetLength(int dimension) -
「"変数名".Count」と「"変数名".Length」の違いで参考になった記事
https://tech.guitarrapc.com/entry/2015/01/17/071137
https://blog.shibata.tech/entry/2015/11/06/212944 -
多次元配列 と ジャグ配列 で参考になった記事
https://cheshire-wara.com/powershell/ps-textbooks/basic-grammar/array-biginner4/ -
Bing AI に聞く
Bing AIの回答内容 < クリックで折りたたみが開く >
❓ Bing AIへの依頼内容("より創造的に")
PowerShellにおける多次元配列で要素数を取得する方法を教えてください。なお、ここでいう多次元配列とはジャグ配列の事ではありません。
✅ Bing AIからの回答
こんにちは、これはBingです。PowerShellに関する質問ありがとうございます。😊
PowerShellにおける多次元配列で要素数を取得する方法は、配列の.Lengthプロパティを使うか、配列のGetLengthメソッドを使うかのどちらかです。¹²
例えば、以下のような3×3の多次元配列があるとします。
# 多次元配列の宣言 $food = New-Object 'object[,]' 3,3 # 多次元配列の要素に値を代入 $food[0,0] = "つけ麺" $food[0,1] = "坦々麺" $food[0,2] = "ラーメン" $food[1,0] = "玉ねぎ" $food[1,1] = "キャベツ" $food[1,2] = "ナス" $food[2,0] = "から揚げ" $food[2,1] = "ステーキ" $food[2,2] = "ハンバーグ"
この多次元配列の要素数を取得するには、以下のようにします。
# 配列の.Lengthプロパティを使う $food.Length # 結果は9 # 配列のGetLengthメソッドを使う $food.GetLength(0) # 結果は3 (行の数) $food.GetLength(1) # 結果は3 (列の数)
.Lengthプロパティは、配列の全要素数を返します。GetLengthメソッドは、指定した次元の要素数を返します。次元は0から始まります。0は最初の次元、1は次の次元、というように続きます。³
以上が、PowerShellにおける多次元配列で要素数を取得する方法です。参考になれば幸いです。👍
¹: 【PowerShell】配列の使い方 | 秋拓技術学院
²: 配列について知りたかったことのすべて - PowerShell | Microsoft ...
³: PowerShellの多次元配列 #PowerShell - Qiitaソース: Bing との会話 2023/12/14
(1) [Part.4]多段階配列と多次元配列を簡単解説 - PowerShellで .... https://cheshire-wara.com/powershell/ps-textbooks/basic-grammar/array-biginner4/.
(2) 【PowerShell】配列の使い方 | 秋拓技術学院. https://syutaku.blog/powershell-array/.
(3) 配列について知りたかったことのすべて - PowerShell | Microsoft .... https://learn.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7.4.
(4) 【PowerShell】配列の使い方 | 秋拓技術学院. https://syutaku.blog/powershell-array/.
(5) 配列について知りたかったことのすべて - PowerShell | Microsoft .... https://learn.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7.4.
(6) PowerShellの多次元配列 #PowerShell - Qiita. https://qiita.com/yanoojapan/items/a4c50b8018332bb77103.
まとめ
- 多次元配列の要素数を取得する場合
"変数名".GetLength("対象の次元数")
- ジャグ配列の要素数を取得する場合
Countプロパティでも確認可能。また、存在しない次元数を指定してもエラーは出ず結果が返ってくるので取り扱い注意!- 1次元目の要素数
"変数名".Length
- 2次元目の要素数
"変数名"[0].Length
- 3次元目の要素数
"変数名"[0][0].Length
- 3次元目以降
同じように変数名の後ろの中括弧([]
)を追加していく形式となる。
- 1次元目の要素数
関連記事
Discussion