.NET VB 配列①

この記事は約14分で読めます。

.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 データ型 '配列の宣言
配列名(インデックス) = 格納した値           '配列の値を格納
変数名 = 配列名(インデックス)               '配列の値を参照Code language: PHP (php)

VBが扱えるデータ型

サンプル

'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)
 NextCode language: PHP (php)

上記の宣言で、userList(0)~userList(4)個の配列ができる。これは、5つの変数を宣言し値を格納することと同じ事になります。

インデックスの上限値=要素数ではない
インデックスの上限値を4とした場合は、0、1、2、3、4の計5個の要素が宣言されることに注意。

二次配列(多次元配列)

2次元配列は、マイクロソフト社のExcel表のような「列」と「行」のような配列を定義することができます。マトリックス(表形式)でデータを処理する必要がある場合や、計算する必要がある場合の時役に立つ。例えば、2階建てのアパートの住民名簿を管理するケース等。

二次配列解説図

書式

Dim 配列名(2次元のインデックス上限値,1次元のインデックス上限値) As データ型 '配列の宣言
配列名(2次元インデックス,1次元インデックス) = 格納した値           '配列の値を格納
変数名 = 配列名(2次元インデックス,1次元インデックス)               '配列の値を参照
Code language: PHP (php)

サンプル

'二次元配列の宣言
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
NextCode language: PHP (php)

三次配列(多次元配列)

3次元配列は、立体的(x座標,y座標,z座標)にデータを格納できる。例えば、A棟のアパートの住民名簿、B棟のアパートの住民名簿のようなケースに使用できる。

三次配列解説図

書式

'配列の宣言
Dim 配列名(3次元のインデックス上限値,2次元のインデックス上限値,1次元のインデックス上限値) As データ型

配列名(3次元インデックス,2次元インデックス,1次元のインデックス) = 格納した値          '配列の値を格納
変数名 = 配列名(3次元インデックス,2次元インデックス,1次元インデックス)               '配列の値を参照
Code language: PHP (php)

サンプル

'三次元配列の宣言
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
NextCode language: PHP (php)

配列の初期化

配列の宣言時に初期データを格納することができる。

1次元配列の初期化

Dim 配列名() As データ型= {初期値,...} 'New省略系
Dim 配列名() As データ型 = New データ型{初期値,...}Code language: PHP (php)

()内には上限要素数を指定しない。

2次元配列の初期化

Dim 配列名(,) As データ型= {{初期値,...},{初期値,...},...} 'New省略パターン
Dim 配列名(,) As データ型 = New データ型(,){{初期値,...},{初期値,...},...}Code language: PHP (php)

3次元配列の初期化

Dim 配列名(,,) As データ型= {初期値,...} 'New省略パターン
Dim 配列名(,,) As データ型 = New データ型(,,){初期値,...}Code language: PHP (php)

サンプル

'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
Code language: PHP (php)

配列のインデックス(要素数)取得

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次配列の最大要素数を返す。Code language: PHP (php)

NG

'2次元配列の宣言と初期化
Dim userList(,) As String = {                                       
                              {"田中", "斉藤", "鈴木"},
                              {"太田", "佐藤", "麻生"}
}
Console.WriteLine(UBound(userList, 1)) '1次配列の最大要素数を返す。
Console.WriteLine(UBound(userList, 2)) '2次配列の最大要素数を返す。Code language: PHP (php)

配列の初期化した場合は、使えない。
.NET Framework 4.8
配列の初期化した場合、要素数がうまく返らない。

GetUpperBoundメソッド

GetUpperBoundメソッドは、宣言されている配列のインデックスの最大値を返す。VB .NETで新たに追加されたArrayクラスのメソッド

書式

配列.GetUpperBound(次元を指定)Code language: CSS (css)

サンプル

'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)の最大のインデックスを返す。Code language: PHP (php)

NG

'2次元配列の宣言と初期化
Dim userList(,) As String = {                                       
                              {"田中", "斉藤", "鈴木"},
                              {"太田", "佐藤", "麻生"}
}
Console.WriteLine(userList.GetUpperBound(0)) '2次配列の最大のインデックスを返す。
Console.WriteLine(userList.GetUpperBound(1)) '1次配列の最大のインデックスを返す。Code language: PHP (php)

配列の初期化した場合は、使えない。
.NET Framework 4.8
配列の初期化した場合、最大のインデックスがうまく返らない。

Lengthプロパティ

配列全体の要素数(すべての要素数)を取得するには、Lenghtプロパティを使用します。

書式

配列名.LengthCode language: CSS (css)

サンプル

'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)Code language: PHP (php)

GetLengthメソッド

多次元配列の要素数を取得する場合は、GetLengthメソッドを使用します。

書式

配列名.GetLength(インデックス)Code language: CSS (css)

2次元配列サンプル

Dim userList(,) As String = {{"田中", "斉藤", "鈴木"}, _
                             {"太田", "佐藤", "麻生"}}

Console.WriteLine(userList.GetLength(0))  '縦(行)の配列の要素数
Console.WriteLine(userList.GetLength(1))  '横(列)の配列の要素数Code language: PHP (php)

3次元配列サンプル

Dim userList(,,) As String = {
     {{"田中", "斉藤", "鈴木", "田部"}, {"田中", "佐藤", "鈴木", "田部"}},
     {{"佐藤", "西郷", "佐々木", "田部"}, {"須藤", "佐藤", "橋本", "田部"}},
     {{"佐藤", "西郷", "佐々木", "田部"}, {"須藤", "佐藤", "橋本", "田部"}}
}      'New省略系

Console.WriteLine(userList.GetLength(0))  '奥行(z)の配列の要素数
Console.WriteLine(userList.GetLength(1))  '縦(y)の配列の要素数
Console.WriteLine(userList.GetLength(2))  '横(x)の配列の要素数Code language: PHP (php)

配列の要素数を動的変更

配列をしていると、動的に配列のサイズを拡張しなければならない場面がある。その時は、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))
 NextCode language: PHP (php)

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))
 NextCode language: VB.NET (vbnet)

コメント

タイトルとURLをコピーしました