VB.NET 配列の仕組みと使い方のサンプル

VB.NETの配列の仕組みと使い方のサンプルです。

仕組み 配列とは
作成 初期値ありで作成 / 要素の数を宣言して作成 / 配列の値を表示
取得 For Each文,For文で要素を取得 / 要素を検索(ContainsとIndexOfの違い)
  要素数を取得(Length)
変更 配列の値を変更(添字) / 配列のサイズを変更(ReDim) / 配列の値をクリア
ソート/コピー 配列の値をソート / 配列をコピー
変換 配列をリストに変換 / リストを配列に変換
使用する メソッドの引数と戻り値が配列

配列とは

Dim a() As String = {値1 , 値2 , 値3} 

上記は複数の値を変数aに代入しています。
この変数aは配列として複数の値を持ちます。

初期値ありで作成

配列の宣言と同時に初期値を設定するサンプルです。

Module Module1
	Sub Main()
		Dim arr1() As String = {"赤", "黄", "青"} '配列
		Console.WriteLine(arr1(0)) '赤が出力される
		Console.WriteLine(arr1(1)) '黄が出力される
		Console.WriteLine(arr1(2)) '青が出力される

		Dim arr2 = {"黒", "灰", "白"} '配列
		Console.WriteLine(arr2(0)) '黒が出力される
		Console.WriteLine(arr2(1)) '灰が出力される
		Console.WriteLine(arr2(2)) '白が出力される

		Dim arr3() As String = New String() {"A", "B", "C"} '配列
		Console.WriteLine(arr3(0)) 'Aが出力される
		Console.WriteLine(arr3(1)) 'Bが出力される
		Console.WriteLine(arr3(2)) 'Cが出力される

		Dim b1() As Byte = {0, 5, 255}
		Dim b2() As SByte = {-128, 5, 127}
	End Sub
End Module

3行目は、リテラルで配列を作成しています。リテラルとはコード中に記述された値です。
8行目は、型の指定をしていませんが右辺の値から自動的に決まります。型推論です。
13行目は、配列の前にNew Stringを使用しています。
18,19行目はバイト配列です。
byteは0から255までで、sbyteは-128から127までです。

要素の数を宣言して作成

配列の要素の数を宣言し後から値を代入するサンプルです。

Module Module1
	Sub Main()
		Dim arr1(3) As String '配列
		arr1(0) = "赤"
		arr1(1) = "黄"
		arr1(2) = "青"
		arr1(3) = "オレンジ"
		'a(4) = "緑" 'インデックスが配列の境界外ですのエラー

		For Each str1 In arr1
			Console.WriteLine(str1) '赤 黄 青 オレンジ
		Next
	End Sub
End Module

3行目は、変数の後のかっこで3を指定しています。
その場合の要素は、4~7行目のようにインデックスは0から3までの4つ入ります
要素の数が3つではないので注意が必要です。
JavaやC#の場合は、3と宣言したら要素の数は3つです。

配列の値を表示

Imports System.Text.RegularExpressions
Module Module1
	Sub Main()
		Dim arr1 = {"赤", "黄", "青"} '配列

		Console.WriteLine(arr1) 'System.String[]

		Console.WriteLine(String.Join(",", arr1)) '赤,黄,青
	End Sub
End Module

6行目のように配列の変数を指定してもSystem.String[]と表示され値が表示されません。
8行目は、Joinメソッドで配列の値をカンマ区切りで結合して表示しています。

For Each文,For文で要素を取得

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列
		'For Each文
		For Each str1 In arr1
			Console.WriteLine(str1) '赤 黄 青が出力される
		Next
		'For文
		For i = 0 To arr1.Count - 1
			Console.WriteLine(arr1(i)) '赤 黄 青が出力される
		Next
		'For文 + UBound
		For i = 0 To UBound(arr1)
			Console.WriteLine(arr1(i)) '赤 黄 青が出力される
		Next
		Console.WriteLine(UBound(arr1)) '2
	End Sub
End Module

5行目は、For Each文です。インデックスの値を使用せずに配列の各値を表示します。
9行目は、For文です。要素の数をcountで取得しインデックス(i)を使用して配列の各値を表示します。
13行目もFor文です。UBoundで配列のインデックスの最大値(2)を取得しています。

要素を検索(ContainsとIndexOfの違い)

Public Function Contains (value As String) As Boolean
Public Shared Function IndexOf (array As Array, value As Object) As Integer

Containsメソッドは、指定の値が存在する場合はTrueを、存在しない場合はFalseを返します。
IndexOfメソッドは、指定の値が存在する場合は位置(数値)を、存在しない場合は-1を返します。

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列
		' Contains
		Console.WriteLine(arr1.Contains("青")) 'True
		Console.WriteLine(arr1.Contains("白")) 'False
		' IndexOf
		Console.WriteLine(Array.IndexOf(arr1, "青")) '2
		Console.WriteLine(Array.IndexOf(arr1, "白")) '-1
	End Sub
End Module

配列の位置は0から始まります。赤=0,黄=1,青=2。

要素数を取得(Length)

Module Module1
	Sub Main()
		Dim arr1 = {"赤", "黄", "青"} '配列
		Console.WriteLine(arr1.Length) '3

		Console.WriteLine(arr1(arr1.Length - 1)) '青
	End Sub
End Module

Lengthは、配列の要素数を取得します。
10行目は、Lengthを使用して最後の要素を取得しています。

配列の値を変更(添字)

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列

		arr1(1) = "オレンジ"

		Console.WriteLine(arr1(0)) '赤
		Console.WriteLine(arr1(1)) 'オレンジ
		Console.WriteLine(arr1(2)) '青
	End Sub
End Module

5行目は、文字列を配列の変数に代入しています。
インデックス(添字)で変更したい要素を指定します

配列のサイズを変更(ReDim)

サイズを変更するにはRedimを使用します。

Module Module1
	Sub Main()
		Dim arr1(2) As String '配列
		arr1(0) = "赤"
		arr1(1) = "黄"
		arr1(2) = "青"

		'arr1(3) = "オレンジ" 'インデックスが配列の境界外のエラー

		ReDim Preserve arr1(3)

		arr1(3) = "オレンジ"

		For Each str1 In arr1
			Console.WriteLine(str1) '赤 黄 青 オレンジ
		Next
	End Sub
End Module

8行目は、配列に値をセットしようとしますが、サイズが足りないことによるエラーが発生します。

10行目は、RedimとPreserveで数値を3にして、サイズを変更しています。
12行目は、値をセットしています。
15行目は、12行目に追加した値が表示されます。

ReDimは、Re + Dimで再宣言という意味です。
Preserveは保持するという意味です。
Preserveがないとそれまでに登録した値がクリアされてしまいます。

配列の値をクリア

public static void Clear(Array array, int index, int length);

Clearメソッドは値をクリアします。

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列
		Console.WriteLine(arr1(0)) '赤
		Console.WriteLine(arr1(1)) '黄
		Console.WriteLine(arr1(2)) '青

		Array.Clear(arr1, 0, arr1.Length)

		Console.WriteLine(arr1.Length) '3
		Console.WriteLine(arr1(0)) '
		Console.WriteLine(arr1(1)) '
		Console.WriteLine(arr1(2)) '
	End Sub
End Module

 

配列の値をソート

Public Shared Sub Sort(Of T)(array() As T)

ArrayクラスのSortメソッドでソートを行います。

Module Module1
	Sub Main()
		' 配列 数値
		Dim arr1() = {100, 2, 99} '配列
		Array.Sort(arr1)
		Console.WriteLine(arr1(0)) '2
		Console.WriteLine(arr1(1)) '99
		Console.WriteLine(arr1(2)) '100

		'配列 文字列
		Dim arr2() As String = {"da", "abb", "pccc"} '配列
		Array.Sort(arr2)
		Console.WriteLine(arr2(0)) 'abb
		Console.WriteLine(arr2(1)) 'da
		Console.WriteLine(arr2(2)) 'pccc
	End Sub
End Module

4行目は、数値の配列です。5行目でソートをしています。
結果は、2,99,100になります。100,2,99にはなりません。
11行目は、文字列の配列です。12行目でソートをしています。
結果は、先頭の文字のabc順に表示されます。

配列をコピー

Array.Copy(コピー元配列,開始位置,コピー先配列,開始位置,コピーする要素数)

ArrayクラスのCopyメソッドでコピーします。

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列
		Dim arr2(arr1.Length - 1) As String

		Array.Copy(arr1, 0, arr2, 0, arr1.Length)

		arr2(1) = "オレンジ"

		For Each str1 In arr1
			Console.WriteLine(str1) '赤 黄 青
		Next
		For Each str1 In arr2
			Console.WriteLine(str1) '赤 オレンジ 青
		Next
	End Sub
End Module

3行目はコピー元の配列で、4行目はコピー先の配列です。
6行目は、ArrayクラスのCopyメソッドで配列をコピーしています。
8行目は、コピー先の配列の値を変更ています。
10~15行目は、コピー先の値は変わりましたが、コピー元の値は変更されていません。

配列をリストに変換

Public Sub New(collection As IEnumerable(Of T))
Public Sub AddRange(collection As IEnumerable(Of T))

配列をリストに変換するサンプルです。

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列
		Dim list1 As New List(Of String)(arr1) 'リスト
		For Each str1 In list1
			Console.WriteLine(str1) '赤 黄 青
		Next

		Dim arr2() As String = {"緑", "紫", "黒"} '配列
		Dim list2 As New List(Of String) 'リスト
		list2.AddRange(arr2)
		For Each str1 As String In list2
			Console.WriteLine(str1) '緑 紫 黒
		Next
	End Sub
End Module

4行目は、配列からリストに変換しています。リストのコンストラクタに配列color1を指定しています。
11行目は、AddRangeメソッドで配列をリストに追加しています。

リストを配列に変換

Public Function ToArray() As T()

ToArrayメソッドは、リストを配列に変換します。

Module Module1
	Sub Main()
		Dim list1 As New List(Of String)(New String() {"赤", "黄", "青"})

		Dim arr1 = list1.ToArray()

		ReDim Preserve arr1(3)
		arr1(3) = "オレンジ"
		For Each str1 In arr1
			Console.WriteLine(str1) '赤 黄 青 オレンジ
		Next
	End Sub
End Module

3行目は、リストです。
5行目は、ToArrayメソッドでリストを配列にしています。
7行目は、配列の機能であるReDim Preserveを使用して配列であることを確認しています。

メソッドの引数と戻り値が配列

メソッドの引数と戻り値が配列のサンプルです。

Module Module1
	Sub Main()
		Dim arr1() = {"赤", "黄", "青"} '配列

		Dim arr2() = GetColor(arr1)
	End Sub

	Private Function GetColor(a1() As String) As String()
		Return a1
	End Function
End Module

5行目は、呼び出し元のメソッドです。引数と戻り値が配列です。
8行目は、定義されたメソッドです。引数と戻り値が配列です。
引数は(a1() As String)で、AS String()が戻り値の型です。

関連の記事

VB.NET 2次元配列のサンプル
VB.NET For文 処理を繰り返す(Exit/Continue)

△上に戻る