配列

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

宣言方法

 宣言方法はVB6と同じです。 ただし、VB6とは異なり、配列の下限は0に固定されています。
001
002
003
004
005
' インデックスが 0 から 5 まで、要素数 6 の Integer型配列
Dim arr2(5) As Integer

' インデックスが 0 から 9 まで、要素数 10 の String型配列
Dim arr1(9) As String
 また、先に空の配列を作成し、ReDimステートメントで動的に配列のサイズを変更できます。
001
002
003
004
005
' 空の配列
Dim arr() As Integer

' 配列の要素数を 10 に指定
ReDim arr(9)
 ただし、ReDimを用いて配列を宣言することはできません。 つまり、必ず先に型を指定して空の配列を宣言しておかなければなりません。 ReDimの際に配列の内容を保持するにはPreserveを付け加えます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
' 空の配列
Dim arr() As Integer

' 配列の要素数を 10 に指定
ReDim arr(9)

' 配列の各要素に値を指定
Dim i As Integer

For i = 0 To 9

    arr(i) = i

Next

' 配列の要素数を変更
ReDim Preserve arr(4)

' 配列の各要素を表示
For i = 0 To 4

    Console.WriteLine(arr(i))

Next
出力結果
0
1
2
3
4

多次元配列

 多次元配列は次のように宣言します。
001
002
003
004
005
006
007
008
009
010
011
' 二次元配列 (要素数は11×11個)
Dim arr1(10, 10) As Integer

' 三次元配列 (要素数は11×11×11個)
Dim arr2(10, 10, 10) As Integer

' 空の二次元配列
Dim arr3(,) As Integer

' 空の三次元配列
Dim arr4(,,) As Integer
 多次元配列でもReDimを使用して要素数を動的に変更することができます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
' 二次元配列 (要素数は11×11個)
Dim arr1(10, 10) As Integer

' 三次元配列 (要素数は11×11×11個)
Dim arr2(10, 10, 10) As Integer

' 要素数を21×21個に
ReDim arr1(20, 20)

' 要素数を11×21×31個に
ReDim arr2(10, 20, 30)


' 空の二次元配列
Dim arr3(,) As Integer

' 空の三次元配列
Dim arr4(,,) As Integer

' 要素数を11×11個に
ReDim arr3(10, 10)

' 要素数を11×11×11個に
ReDim arr4(10, 10, 10)
 ただし、Preserve指定した場合は、一番最後の次元の要素数のみを変更できます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
' 二次元配列 (要素数は11×11個)
Dim arr1(10, 10) As Integer

' 三次元配列 (要素数は11×11×11個)
Dim arr2(10, 10, 10) As Integer

' 要素数を11×21個に
ReDim Preserve arr1(10, 20)

' 要素数を11×11×21個に
ReDim Preserve arr2(10, 10, 20)

' 要素数を21×21個に (実際には例外エラーが発生します)
ReDim Preserve arr1(20, 20)

' 要素数を21×21×21個に (実際には例外エラーが発生します)
ReDim Preserve arr2(20, 20, 20)

配列の初期化

 一次元配列を初期化する場合は次のようにします。
001
002
' 要素数は 5 になる
Dim arr() As Integer = {0, 1, 2, 3, 4}
 多少複雑になりますが、多次元配列でも同様の方法で行えます。
001
002
003
004
005
' 要素数は 5×5 になる
Dim arr1(,) As Integer = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}

' 要素数は 2×2×5 になる
Dim arr2(,,) As Integer = {{{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}, {{10, 11, 12, 13, 14}, {15, 16, 17, 18, 19}}}
 次のコードはこれと同じ要素を持つ配列を作成するためのコードです。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
Dim i, j, k, n As Integer

' 二次元配列の初期化
Dim arr1(,) As Integer

ReDim arr1(1, 4)

n = 0

For i = 0 To 1
    For j = 0 To 4
        arr1(i, j) = n
        n += 1
    Next j
Next i

' 三次元配列の初期化
Dim arr2(,,) As Integer

ReDim arr2(1, 1, 4)

n = 0

For i = 0 To 1
    For j = 0 To 1
        For k = 0 To 4
            arr2(i, j, k) = n
            n += 1
        Next k
    Next j
Next i

配列のプロパティ

 VB.NETの配列は、Arrayクラスから派生しています。 そのためいくつかのメソッドやプロパティを持っています。 まずはプロパティについて見てみます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
' 一次元配列について
Dim arr1() As Integer = {0, 1, 2, 3, 4}

' Lengthプロパティ 配列の全要素数
Console.WriteLine(arr1.Length)

' Rankプロパティ 配列の次元数
Console.WriteLine(arr1.Rank)


' 二次元配列について
Dim arr2(,) As Integer = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}

Console.WriteLine(arr2.Length)

Console.WriteLine(arr2.Rank)
出力結果
5
1
10
2
 Lengthプロパティでは配列に含まれるすべての要素数を知ることができます。 また、Rankプロパティでは次元を知ることができます。 次元毎の要素数を知りたい場合は次の項を参考にしてください。

配列のメソッド

 始めに配列のインスタンスメソッドについて見てみます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
' 一次元配列について
Dim arr1() As Integer = {0, 1, 2, 3, 4}

' 0次元目の要素数
Console.WriteLine(arr1.GetLength(0))


' 二次元配列について
Dim arr2(,) As Integer = {{0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}}

' 0次元目の要素数
Console.WriteLine(arr2.GetLength(0))

' 1次元目の要素数
Console.WriteLine(arr2.GetLength(1))


' 配列のコピー
Dim arr3(arr1.Length - 1) As Integer

arr1.CopyTo(arr3, 0)

' arr1とarr3の値を表示
Dim i As Integer

For i = 0 To arr1.Length - 1

    Console.WriteLine("{0} : {1}", arr1(i), arr3(i))

Next
出力結果
5
2
5
0 : 0
1 : 1
2 : 2
3 : 3
4 : 4
 GetLength()メソッドを利用すると任意の次元の要素数を知ることができます。 また、CopyTo()メソッドを利用すると簡単に配列のコピーを作成することができます。 続いて共有メソッドについて見てみます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
' 一次元配列について
Dim arr() As Integer = {4, 2, 3, 0, 1}

' arrの値を表示
Dim i As Integer

For i = 0 To arr.Length - 1
    Console.Write("{0} ", arr(i))
Next
Console.WriteLine()

' 並べ替え
Array.Sort(arr)

' arrの値を表示
For i = 0 To arr.Length - 1
    Console.Write("{0} ", arr(i))
Next
Console.WriteLine()

' 反転
Array.Reverse(arr)

' arrの値を表示
For i = 0 To arr.Length - 1
    Console.Write("{0} ", arr(i))
Next
Console.WriteLine()

' 1 を含むインデックスを取得する
Dim index As Integer = Array.IndexOf(arr, 1)

Console.WriteLine(index)

' 配列のインデックス0から3要素分クリアする
Array.Clear(arr, 0, 3)

' arrの値を表示
For i = 0 To arr.Length - 1
    Console.Write("{0} ", arr(i))
Next
Console.WriteLine()
出力結果
4 2 3 0 1
0 1 2 3 4
4 3 2 1 0
3
0 0 0 1 0
 共有メソッドは配列自体からも使用することもできますし、この例のようにArrayクラスから直接使用することもできます。 また、当然ですが多次元配列でも同様に使用することができます。