Visual Basic .NET Language
アレイ
サーチ…
備考
Dim myArray(2) As Integer
someFunc(myArray)
配列は、オブジェクトのインデックス順コレクションです。オブジェクトの型は、配列宣言で与えられた型によって定義されます。
Visual Basic .NETの配列は、最も一般的な(そしてデフォルトでは)ゼロ(0)ベースです。つまり、最初のインデックスは0です。10要素の配列のインデックス範囲は0〜9です。配列要素にアクセスするとき、アクセス可能な最大のインデックスは、要素の総数より1少ないです。このため、配列インデックスをインクリメンタルにアクセスするループは、値が配列の長さよりも小さい場合に常に範囲チェックを行う必要があります。
配列定義
Dim array(9) As Integer ' Defines an array variable with 10 Integer elements (0-9).
Dim array = New Integer(10) {} ' Defines an array variable with 11 Integer elements (0-10)
'using New.
Dim array As Integer() = {1, 2, 3, 4} ' Defines an Integer array variable and populate it
'using an array literal. Populates the array with
'4 elements.
ReDim Preserve array(10) ' Redefines the size of an existing array variable preserving any
'existing values in the array. The array will now have 11 Integer
'elements (0-10).
ReDim array(10) ' Redefines the size of an existing array variable discarding any
'existing values in the array. The array will now have 11 Integer
'elements (0-10).
ゼロベース
VB.NETのすべての配列はゼロベースです。つまり、VB.NET配列の最初の項目(下限)のインデックスは常に0
です。 VB6やVBAなどの古いバージョンのVBは、デフォルトでは1つになっていましたが、デフォルトの境界を上書きする手段を提供していました。 VBのそれ以前のバージョンでは、下限と上限が明示的に、例えば(明記することができるDim array(5 To 10)
。VB.NETで、他の.NET言語との互換性を維持するために、その柔軟性を除去し、下限0
が常に強制されるようになっていますが、 To
構文はVB.NETでも使用できます。これにより、明示的に範囲を明確にすることができます。
Dim array(0 To 9) As Integer
Dim array = New Integer(0 To 10) {}
ReDim Preserve array(0 To 10)
ReDim array(0 To 10)
入れ子配列宣言
Dim myArray = {{1, 2}, {3, 4}}
一次元配列を宣言し、配列要素の値を設定する
Dim array = New Integer() {1, 2, 3, 4}
または
Dim array As Int32() = {1, 2, 3, 4}
配列の初期化
Dim array() As Integer = {2, 0, 1, 6} ''Initialize an array of four Integers.
Dim strings() As String = {"this", "is", "an", "array"} ''Initialize an array of four Strings.
Dim floats() As Single = {56.2, 55.633, 1.2, 5.7743, 22.345}
''Initialize an array of five Singles, which are the same as floats in C#.
Dim miscellaneous() as Object = { New Object(), "Hello", New List(of String) }
''Initialize an array of three references to any reference type objects
''and point them to objects of three different types.
多次元配列の初期化
Dim array2D(,) As Integer = {{1, 2, 3}, {4, 5, 6}}
' array2D(0, 0) is 1 ; array2D(0, 1) is 2 ; array2D(1, 0) is 4
Dim array3D(,,) As Integer = {{{1, 2, 3}, {4, 5, 6}}, {{7, 8, 9}, {10, 11, 12}}}
' array3D(0, 0, 0) is 1 ; array3D(0, 0, 1) is 2
' array3D(0, 1, 0) is 4 ; array3D(1, 0, 0) is 7
ジャグドアレイの初期化
ジグザグ配列と多次元配列を区別するためにかっこに注意してください。サブ配列の長さは異なってもかまいません
Dim jaggedArray()() As Integer = { ({1, 2, 3}), ({4, 5, 6}), ({7}) }
' jaggedArray(0) is {1, 2, 3} and so jaggedArray(0)(0) is 1
' jaggedArray(1) is {4, 5, 6} and so jaggedArray(1)(0) is 4
' jaggedArray(2) is {7} and so jaggedArray(2)(0) is 7
ヌル配列変数
配列は参照型なので、配列変数はnullでもかまいません。 null配列変数を宣言するには、サイズを指定せずに宣言する必要があります。
Dim array() As Integer
または
Dim array As Integer()
配列がnullかどうかを調べるには、それIs Nothing
かどうかを調べます。
Dim array() As Integer
If array Is Nothing Then
array = {1, 2, 3}
End If
既存の配列変数をnullに設定するには、単純にNothing
設定します。
Dim array() As Integer = {1, 2, 3}
array = Nothing
Console.WriteLine(array(0)) ' Throws a NullReferenceException
または、同じことを行うErase
使用します。
Dim array() As Integer = {1, 2, 3}
Erase array
Console.WriteLine(array(0)) ' Throws a NullReferenceException
2つの変数から同じ配列を参照する
配列は参照型なので、同じ配列オブジェクトを指す複数の変数を持つことは可能です。
Dim array1() As Integer = {1, 2, 3}
Dim array2() As Integer = array1
array1(0) = 4
Console.WriteLine(String.Join(", ", array2)) ' Writes "4, 2, 3"
ゼロ以外の下限
Option Strict On
と、.NET Frameworkではゼロ以外の下限値を持つ1次元配列を作成できますが、VB.NET型配列との互換性はありません。つまり、 Array
としてしか見ることができないので、通常の配列(index)
参照は使用できません。
Dim a As Array = Array.CreateInstance(GetType(Integer), {4}, {-1})
For y = LBound(a) To UBound(a)
a.SetValue(y * y, y)
Next
For y = LBound(a) To UBound(a)
Console.WriteLine($"{y}: {a.GetValue(y)}")
Next
Option Strict Off
を使うだけでなく、配列をIList
として扱うことで(index)
構文を戻すこともできますが、配列ではないので、その変数名にLBound
とUBound
を使うことはできません。まだボクシングを避けていない):
Dim nsz As IList = a
For y = LBound(a) To UBound(a)
nsz(y) = 2 - CInt(nsz(y))
Next
For y = LBound(a) To UBound(a)
Console.WriteLine($"{y}: {nsz(y)}")
Next
多次元非ゼロ下限配列は 、VB.NET多次元型配列と互換性があります。
Dim nza(,) As Integer = DirectCast(Array.CreateInstance(GetType(Integer),
{4, 3}, {1, -1}), Integer(,))
For y = LBound(nza) To UBound(nza)
For w = LBound(nza, 2) To UBound(nza, 2)
nza(y, w) = -y * w + nza(UBound(nza) - y + LBound(nza),
UBound(nza, 2) - w + LBound(nza, 2))
Next
Next
For y = LBound(nza) To UBound(nza)
Dim ly = y
Console.WriteLine(String.Join(" ",
Enumerable.Repeat(ly & ":", 1).Concat(
Enumerable.Range(LBound(nza, 2), UBound(nza, 2) - LBound(nza, 2) + 1) _
.Select(Function(w) CStr(nza(ly, w))))))
Next
MSDNリファレンス: Array.CreateInstance