.NET VB 配列①
.NET VB 配列(1次元配列、多次元配列)の使用法、要素数の調べ方(Lengthプロパティ、GetLengthプロパティ、GetUpperメソッド、GetUpperBoundメソッド)、配列の初期化(初期データの入れ方)、要素数を動的に変更(ReDim、New演算子、Preserveキーワード)について調べたので解説風に記録しておく。
配列とは
変数に格納できる値は1つですが、複数のデータをまとめて扱いたい時があります。データベースから取得した複数の値(カラム)を取得し、加工した値を画面やCSVファイルに出力したい場合など。
そのような場合は、配列を使用することで
配列は、複数の値を1つ1つ変数を定義して格納するのではなく、1つの定義とインデックスを使用して。複数の値を格納できるようにしたものです。配列には、1次元配列、2次元配列、多次元配列があります。
配列の宣言方法
一次配列
1列に並んだ要素がインデックス(番号)によって管理される配列を1次配列と言います。配列は0からカウントが始まります。配列数の上限を4とした場合は、要素の数は5つになります。配列1個1個に対してのアクセスは、配列名のカッコ内にアクセスしたい番号をセットすることで、データの参照や格納ができます。
書式
Dim 配列名(インデックス上限値) As データ型 '配列の宣言
配列名(インデックス) = 格納した値 '配列の値を格納
変数名 = 配列名(インデックス) '配列の値を参照
サンプル
'5つの配列要素を定義し、インデックス0~5に名前を格納します。
'配列に格納した値をループを使って取り出すサンプル
Dim userList(4) As String
userList(0) = "田中" 'インデックス0の箱に田中という文字列を格納
userList(1) = "斉藤" 'インデックス0の箱に斉藤という文字列を格納
userList(2) = "鈴木" 'インデックス0の箱に鈴木という文字列を格納
userList(3) = "太田" 'インデックス0の箱に太田という文字列を格納
userList(4) = "佐藤" 'インデックス0の箱に佐藤という文字列を格納
For i As Integer = 0 To 4
Console.WriteLine("配列(" & i & ")番目の値:" & userList(i).ToString)
Next
上記の宣言で、userList(0)~userList(4)個の配列ができる。これは、5つの変数を宣言し値を格納することと同じ事になります。
インデックスの上限値=要素数ではない
インデックスの上限値を4とした場合は、0、1、2、3、4の計5個の要素が宣言されることに注意。
二次配列(多次元配列)
2次元配列は、マイクロソフト社のExcel表のような「列」と「行」のような配列を定義することができます。マトリックス(表形式)でデータを処理する必要がある場合や、計算する必要がある場合の時役に立つ。例えば、2階建てのアパートの住民名簿を管理するケース等。
書式
Dim 配列名(2次元のインデックス上限値,1次元のインデックス上限値) As データ型 '配列の宣言
配列名(2次元インデックス,1次元インデックス) = 格納した値 '配列の値を格納
変数名 = 配列名(2次元インデックス,1次元インデックス) '配列の値を参照
サンプル
'二次元配列の宣言
Dim userList(1, 4) As String
'1階に住んでいる住民名を配列に格納
userList(0, 0) = "田中"
userList(0, 1) = "斉藤"
userList(0, 2) = "鈴木"
userList(0, 3) = "太田"
userList(0, 4) = "佐藤"
'2階に住んでいる住民名を配列に格納
userList(1, 0) = "後藤"
userList(1, 1) = "佐々木"
userList(1, 2) = "橋本"
userList(1, 3) = "武井"
userList(1, 4) = "藤田"
'2次元配列の場合は、二重ループを使用する。(ループのネスト)
For i As Integer = 0 To 1
For j As Integer = 0 To 4
Console.WriteLine("配列(" & i & "," & j & ")番目の値:" & userList(i, j).ToString)
Next
Next
三次配列(多次元配列)
3次元配列は、立体的(x座標,y座標,z座標)にデータを格納できる。例えば、A棟のアパートの住民名簿、B棟のアパートの住民名簿のようなケースに使用できる。
書式
'配列の宣言
Dim 配列名(3次元のインデックス上限値,2次元のインデックス上限値,1次元のインデックス上限値) As データ型
配列名(3次元インデックス,2次元インデックス,1次元のインデックス) = 格納した値 '配列の値を格納
変数名 = 配列名(3次元インデックス,2次元インデックス,1次元インデックス) '配列の値を参照
サンプル
'三次元配列の宣言
Dim userList(1, 1, 4) As String
userList(0, 0, 0) = "A棟の田中"
userList(0, 0, 1) = "A棟の斉藤"
userList(0, 0, 2) = "A棟の鈴木"
userList(0, 0, 3) = "A棟の太田"
userList(0, 0, 4) = "A棟の佐藤"
userList(0, 1, 0) = "A棟の後藤"
userList(0, 1, 1) = "A棟の佐々木"
userList(0, 1, 2) = "A棟の橋本"
userList(0, 1, 3) = "A棟の武井"
userList(0, 1, 4) = "A棟の藤田"
userList(1, 0, 0) = "B棟の田中"
userList(1, 0, 1) = "B棟の斉藤"
userList(1, 0, 2) = "B棟の鈴木"
userList(1, 0, 3) = "B棟の太田"
userList(1, 0, 4) = "B棟の佐藤"
userList(1, 1, 0) = "B棟の後藤"
userList(1, 1, 1) = "B棟の佐々木"
userList(1, 1, 2) = "B棟の橋本"
userList(1, 1, 3) = "B棟の武井"
userList(1, 1, 4) = "B棟の藤田"
'三次元配列は三重ループを使用する。
For i As Integer = 0 To 1
For j As Integer = 0 To 1
For k As Integer = 0 To 4
Console.WriteLine("配列(" & i & "," & j & "," & k & ")番目の値:" & userList(i, j, k).ToString)
Next
Next
Next
配列の初期化
配列の宣言時に初期データを格納することができる。
1次元配列の初期化
Dim 配列名() As データ型= {初期値,...} 'New省略系
Dim 配列名() As データ型 = New データ型{初期値,...}
()内には上限要素数を指定しない。
2次元配列の初期化
Dim 配列名(,) As データ型= {{初期値,...},{初期値,...},...} 'New省略パターン
Dim 配列名(,) As データ型 = New データ型(,){{初期値,...},{初期値,...},...}
3次元配列の初期化
Dim 配列名(,,) As データ型= {初期値,...} 'New省略パターン
Dim 配列名(,,) As データ型 = New データ型(,,){初期値,...}
サンプル
'1次元配列のサンプル
Dim userList() As String = {"田中","斉藤","鈴木","太田","佐藤"} 'New省略系
Dim userList() As String = New String {"田中","斉藤","鈴木","太田","佐藤"}
2次元配列のサンプル
'New省略系
Dim userList(,) As String = {
{"田中", "斉藤", "鈴木"}, _
{"太田", "佐藤", "麻生"}
}
'Dim userList(,) As String = New String(,) {
{"田中", "斉藤", "鈴木"}, _
{"太田", "佐藤", "麻生"}
}
For i As Integer = 0 To 1
For j As Integer = 0 To 2
Console.WriteLine("配列(" & i & "," & j & ")番目の値:" & userList(i, j).ToString)
Next
Next
'3次元配列のサンプル
Dim userList(,,) As String = {
{{"田中", "斉藤", "鈴木"}, {"田中", "佐藤", "鈴木"}},
{{"佐藤", "西郷", "佐々木"}, {"須藤", "佐藤", "橋本"}}
} 'New省略系
'Dim userList(,,) As String = New String(,,) {
{{"田中", "斉藤", "鈴木"}, {"田中", "佐藤", "鈴木"}},
'{{"佐藤", "西郷", "佐々木"}, {"須藤", "佐藤", "橋本"}}
}
'三次元配列は三重ループを使用する。
For i As Integer = 0 To 1
For j As Integer = 0 To 1
For k As Integer = 0 To 2
Console.WriteLine("配列(" & i & "," & j & "," & k & ")番目の値:" & userList(i, j, k).ToString)
Next
Next
Next
配列のインデックス(要素数)取得
UBound関数
UBound関数は、宣言されている配列の要素数の最大値を返す。VB6.0から引き継がれた関数である。
書式
UBound(変数名)
UBound(変数名,次元を指定)
サンプル
Dim userList(2, 4) As Integer '2次元配列を宣言
Console.WriteLine(UBound(userList, 1)) '1次配列の最大要素数を返す。
Console.WriteLine(UBound(userList, 2)) '2次配列の最大要素数を返す。
NG
'2次元配列の宣言と初期化
Dim userList(,) As String = {
{"田中", "斉藤", "鈴木"},
{"太田", "佐藤", "麻生"}
}
Console.WriteLine(UBound(userList, 1)) '1次配列の最大要素数を返す。
Console.WriteLine(UBound(userList, 2)) '2次配列の最大要素数を返す。
配列の初期化した場合は、使えない。
.NET Framework 4.8
配列の初期化した場合、要素数がうまく返らない。
GetUpperBoundメソッド
GetUpperBoundメソッドは、宣言されている配列のインデックスの最大値を返す。VB .NETで新たに追加されたArrayクラスのメソッド
書式
配列.GetUpperBound(次元を指定)
サンプル
'2次元配列の場合
Dim userList2D(2, 4) As Integer '2次元配列を宣言
Console.WriteLine("2次元配列の最大のインデックス")
Console.WriteLine(userList2D.GetUpperBound(0)) '2次配列の最大のインデックスを返す。
Console.WriteLine(userList2D.GetUpperBound(1)) '1次配列の最大のインデックスを返す。
'2次元配列の場合
Dim userList3D(2,3,4) As Integer '3次元配列を宣言
Console.WriteLine("3次元配列の最大のインデックス")
Console.WriteLine(userList3D.GetUpperBound(0)) '3次配列(z)の最大のインデックスを返す。
Console.WriteLine(userList3D.GetUpperBound(1)) '2次配列(y)の最大のインデックスを返す。
Console.WriteLine(userList3D.GetUpperBound(2)) '1次配列(x)の最大のインデックスを返す。
NG
'2次元配列の宣言と初期化
Dim userList(,) As String = {
{"田中", "斉藤", "鈴木"},
{"太田", "佐藤", "麻生"}
}
Console.WriteLine(userList.GetUpperBound(0)) '2次配列の最大のインデックスを返す。
Console.WriteLine(userList.GetUpperBound(1)) '1次配列の最大のインデックスを返す。
配列の初期化した場合は、使えない。
.NET Framework 4.8
配列の初期化した場合、最大のインデックスがうまく返らない。
Lengthプロパティ
配列全体の要素数(すべての要素数)を取得するには、Lenghtプロパティを使用します。
書式
配列名.Length
サンプル
'1次元配列
Console.WriteLine("1次元配列")
Dim userList1D1(4) As String
Dim userList1D2() As String = {"田中", "斉藤", "鈴木", "太田", "佐藤"}
Console.WriteLine("userList1D1:" & userList1D1.Length)
Console.WriteLine("userList1D2:" & userList1D2.Length)
'2次元配列
Console.WriteLine("2次元配列")
Dim userList2D1(1, 2) As String
Dim userList2D2(,) As String = {
{"田中", "斉藤", "鈴木"},
{"太田", "佐藤", "麻生"}
}
Console.WriteLine("userList2D1:" & userList2D1.Length)
Console.WriteLine("userList2D2:" & userList2D2.Length)
'3次元配列
Console.WriteLine("3次元配列")
Dim userList3D1(1, 1, 2) As String
Dim userList3D2(,,) As String = {
{{"田中", "斉藤", "鈴木"}, {"田中", "佐藤", "鈴木"}},
{{"佐藤", "西郷", "佐々木"}, {"須藤", "佐藤", "橋本"}}
}
Console.WriteLine("userList3D1:" & userList3D1.Length)
Console.WriteLine("userList3D2:" & userList3D2.Length)
GetLengthメソッド
多次元配列の要素数を取得する場合は、GetLengthメソッドを使用します。
書式
配列名.GetLength(インデックス)
2次元配列サンプル
Dim userList(,) As String = {{"田中", "斉藤", "鈴木"}, _
{"太田", "佐藤", "麻生"}}
Console.WriteLine(userList.GetLength(0)) '縦(行)の配列の要素数
Console.WriteLine(userList.GetLength(1)) '横(列)の配列の要素数
3次元配列サンプル
Dim userList(,,) As String = {
{{"田中", "斉藤", "鈴木", "田部"}, {"田中", "佐藤", "鈴木", "田部"}},
{{"佐藤", "西郷", "佐々木", "田部"}, {"須藤", "佐藤", "橋本", "田部"}},
{{"佐藤", "西郷", "佐々木", "田部"}, {"須藤", "佐藤", "橋本", "田部"}}
} 'New省略系
Console.WriteLine(userList.GetLength(0)) '奥行(z)の配列の要素数
Console.WriteLine(userList.GetLength(1)) '縦(y)の配列の要素数
Console.WriteLine(userList.GetLength(2)) '横(x)の配列の要素数
配列の要素数を動的変更
配列をしていると、動的に配列のサイズを拡張しなければならない場面がある。その時は、ReDimステートメントを使用することで、配列のサイズを変更することができる。2次元配列の場合は、0
書式
ReDim 配列名(インデックス)
サンプル
Dim price() As Integer = {100, 200, 250, 150}
ReDim price(9) '配列のサイズを4→10に拡張
For i As Integer = 0 To price.Length - 1
Console.WriteLine("配列(" & i & ")の値:" & price(i))
Next
Preserveキーワード
さて、上記のサンプル例では配列のサイズを変更すると、元の値が失われすべて0がセットされてします。元の値を保持するためには、Preserveキーワードを付ける必要があります。
書式
ReDim Preserve 配列名(インデックス)
サンプル
Dim price() As Integer = {100, 200, 250, 150}
ReDim Preserve price(9) '配列のサイズを4→10に拡張
For i As Integer = 0 To price.Length - 1
Console.WriteLine("配列(" & i & ")の値:" & price(i))
Next