VB.NETの配列の仕組みと使い方のサンプルです。
仕組み | 配列とは |
作成 | 初期値ありで作成 / 要素の数を宣言して作成 / 配列の値を表示 |
取得 | For Each文,For文で要素を取得 / 要素を検索(ContainsとIndexOfの違い) |
要素数を取得(Length) | |
変更 | 配列の値を変更(添字) / 配列のサイズを変更(ReDim) / 配列の値をクリア |
ソート/コピー | 配列の値をソート / 配列をコピー |
変換 | 配列をリストに変換 / リストを配列に変換 |
使用する | メソッドの引数と戻り値が配列 |
配列とは
Dim a() As String = {値1 , 値2 , 値3} |
上記は複数の値を変数aに代入しています。
この変数aは配列として複数の値を持ちます。
- 1つの変数で同じ型の複数の値を保持できます。
- 各項目を要素(element)といいます。
- 要素の位置をインデックス(添字)で管理します。上記図では(0)、(1)、(2)、(3)です。
- インデックスは0から始まります。
- 以下はMicrosoftの配列 (Visual Basic)のリンクです。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/arrays/
初期値ありで作成
配列の宣言と同時に初期値を設定するサンプルです。
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()が戻り値の型です。
関連の記事