Visual Basic における配列
配列は、学校の各学年の生徒の数など、互いに論理的に関連する一連の値です。
配列を使用して、同じ名前でこれらの関連する値を参照し、それらにするには、インデックスまたは添字と呼ばれる番号を使用します。個々の値は、配列の要素と呼ばれます。これは、インデックス 0 から最も大きいインデックス値に連続しています。
配列とは対照的に、変数を含む単一の値スカラー変数と呼ばれます。
このトピックの内容
単純な配列の配列要素
配列の作成
配列の宣言
配列への値の格納
配列への初期値の取り込み
- 入れ子になった配列リテラル
配列を繰り返します。
パラメーターと戻り値をとしての配列
ジャグ配列
長さ 0 の配列
配列のサイズ
配列の型および他の型
配列の代わりとしてのコレクション
単純な配列の配列要素
次の例では、学校の各学年の生徒の数を保持するために、配列変数を宣言しています。
Dim students(6) As Integer
上の例の配列 students は 7 個の要素があります。要素のインデックスの範囲は 0 から 6 までです。この配列をであることは、7 種類の変数を宣言がより簡単です。
students 配列を次の図に示します。配列の各要素は、次のとおりです。
要素のインデックスは、学年を表します (インデックス 0 は幼稚園を表します)。
要素に含まれる値は、その学年の生徒の数を表します。
"生徒" 配列の要素
次の例は、students 配列の先頭の要素、2 番目の要素、および最後の要素を参照する方法を示します。
Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))
インデックスを持たない配列変数名だけを使用して、配列全体を参照できます。
前の例の配列 students は、1 次元と呼ばれ、1 種類のインデックス。複数のインデックスまたは添字が使用されている配列は、多次元と呼ばれます。詳細については、このトピック Visual Basic における配列の次元 の残りの部分を参照してください。
配列の作成
複数の方法で配列のサイズを定義できます。次の例に示すように、配列を宣言するときにサイズを指定できます。
Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte
次の例に示すように、作成した場合も、配列のサイズを指定するには New 句を使用できます。
cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}
既存の配列がある場合は、Redim ステートメントを使用してサイズを再定義できます。Redim のステートメントが配列内にある、または空の配列を作成するように指定する値を保持するように指定できます。次に、Redim ステートメントを使用して既存の配列のサイズを変更する例をいくつか示します。
' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)
詳細については、「ReDim ステートメント (Visual Basic)」を参照してください。
配列の宣言
配列変数は、他の変数と同じように Dim ステートメントを使用して宣言します。一つ以上のかっこと型または一つの値を含む変数であるスカラーではなく配列を保持することを示すために、変数名に続けて。
配列を宣言した後、ReDim ステートメント (Visual Basic)を使用してサイズを定義できます。
次の例では、型の後で組のかっこを追加して 1 次元配列変数を宣言します。この例では、ReDim ステートメント (Visual Basic)を使用して配列の次元を指定しています。
' Declare a one-dimensional array.
Dim cargoWeights As Double()
' Dimension the array.
ReDim cargoWeights(15)
次の例では、型の後で組のかっこを追加するディメンションを分離するためにかっこの中にコンマを設定することで、多次元配列変数を宣言します。この例では、ReDim ステートメント (Visual Basic)を使用して配列の次元を指定しています。
' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)
' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)
ジャグ配列変数を宣言するには、組のかっこの後、入れ子になった配列の各レベルの変数名追加。
Dim inquiriesByYearMonthDay()()() As Byte
上の例では、配列変数を宣言しますが、配列を再配置。配列を作成して初期化し、変数に割り当てる必要があります。
配列への値の格納
配列のそれぞれの位置には、Integer 型のインデックスを使用してアクセスできます。かっこで囲まれたインデックスを使用して配列のそれぞれの位置を参照することで、配列の値を格納および取得することができます。多次元配列のインデックスはコンマで区切って指定します (、)。配列の各次元の 1 種類のインデックスが必要です。配列に値を格納するステートメントの例を示します。
Dim i = 4
Dim j = 2
Dim numbers(10) As Integer
Dim matrix(5, 5) As Double
numbers(i + 1) = 0
matrix(3, j * 2) = j
配列から値を取得するステートメントの例を示します。
Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)
配列への初期値の取り込み
配列リテラルを使用して、初期値のセットを含む配列を作成できます。配列リテラルは、中かっこ ({}) で囲んだ値のコンマ区切りの一覧で構成されます。
配列リテラルを使用して配列を作成する場合、配列の型を指定するか、型の推論を使用して配列の型を決定することができます。次のコードは、両方のオプションを示します。
Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}
型の推論を使用すると、配列の型は最も優先度の高い型によって型、配列リテラルに指定された値の一覧が決まります。最も優先度の高い型はすべての一方が、配列リテラルを入力できる拡大する一意の型です。この一意の型を特定できない場合、最も優先度の高い型は、配列内の他のすべてを縮小変換できる入力する一意の型になります。これらの一意の型をどちらも特定できない場合は、Object が最も優先度の高い型になります。たとえば、配列リテラルに指定された値の一覧に型 Integer、Longと Doubleの値を含む場合、結果の配列の型 Doubleです。Integer と Long は両方 Doubleにだけ反映されます。そのため、Double が最も優先度の高い型になります。詳細については、「拡大変換と縮小変換 (Visual Basic)」を参照してください。これらの推論規則は、クラス メンバーで定義されているローカル変数の配列であると推論される型に適用されます。クラス レベルの変数を作成するときに配列リテラルを使用できますが、クラス レベルで型の推論を使用できません。そのため、クラス レベルで指定される配列リテラルは、型として Object配列リテラルに指定された値を推論します。
配列リテラルを使用して作成した配列の要素の型を明示的に指定できます。この場合、配列リテラル内の値を配列の要素の型に拡大変換する必要があります。整数の一覧から Double 型の配列を作成するコード例を次に示します。
Dim values As Double() = {1, 2, 3, 4, 5, 6}
入れ子になった配列リテラル
入れ子になった配列リテラルを使用すると、多次元配列を作成できます。入れ子になった配列リテラルは、結果の配列と一致しているディメンション、または順位のディメンションと数が必要です。配列リテラルを使用して整数の 2 次元配列を作成するコード例を次に示します。
Dim grid = {{1, 2}, {3, 4}}
前の例では、エラーが入れ子になった配列リテラル内の要素の数が一致しない場合に発生します。エラーは、2 次元以外になるように明示的に配列変数を宣言した場合です。
[!メモ]
入れ子になった配列リテラルで異なる次元を指定する場合のエラーを回避するには、内側の配列をかっこで囲みます。かっこは、配列リテラル式を評価する結果値は、外側の配列リテラルで次のコードに示すように、が使用されます。
Dim values = {({1, 2}), ({3, 4, 5})}
入れ子になった配列リテラルを使用して多次元配列を作成する場合、型の推論を使用できます。型の推論を使用すると、推論される型は、入れ子レベルのすべての配列リテラルに含まれるすべての値の中で最も優先度の高い型になります。Integer 型と Double 型の値から Double 型の 2 次元配列を作成するコード例を次に示します。
Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
その他の例については、「方法: Visual Basic で配列変数を初期化する」を参照してください。
配列を繰り返します。
配列を繰り返す場合、小さいインデックスからの最も大きいインデックスに配列の各要素にアクセスします。
次の例では、1 次元配列によって For...Next ステートメント (Visual Basic)を使用して繰り返します。GetUpperBound のメソッドは、インデックスができる最も高い値を返します。一番低いインデックス値は常に 0 です。
Dim numbers = {10, 20, 30}
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index))
Next
' Output:
' 10
' 20
' 30
次の例は、多次元配列で For...Next のステートメントを使用して、繰り返します。GetUpperBound のメソッドにディメンションを指定するパラメーターがあります。GetUpperBound(0) は最初の次元の大きいインデックス値、および GetUpperBound(1) の戻り値を 2 番目の次元の大きいインデックス値を返します。
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
' Output
' 1 2
' 3 4
' 5 6
次の例では、1 次元配列で For Each...Next ステートメント (Visual Basic)を使用して繰り返します。
Dim numbers = {10, 20, 30}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 10
' 20
' 30
次の例は、多次元配列で For Each...Next のステートメントを使用して、繰り返します。ただし For…Next の入れ子になったステートメントを使用すると、For Each…Next のステートメントではなく、前の例のように、多次元配列の要素の方が、コントロールします。
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 1
' 2
' 3
' 4
' 5
' 6
パラメーターと戻り値をとしての配列
Function のプロシージャから配列を返すには、次元の配列データ型と数を、Function ステートメント (Visual Basic)の戻り値の型を指定します。関数内で、ディメンションの数と同じデータ型を持つローカルの配列変数を宣言します。Return ステートメント (Visual Basic)では、かっこを付けずにローカルの配列変数を含めます。
Sub または Function のプロシージャにパラメーターとして配列を指定するには、ディメンションの指定されたデータ型と数を配列とパラメーターを定義します。プロシージャの呼び出しでは、ディメンションのデータ型と同じ数の配列変数を送信します。
次の例では、GetNumbers 関数は Integer()を返します。この配列型は型 Integerの 1 次元配列です。ShowNumbers の手順では Integer() の引数を受け取ります。
Public Sub Process()
Dim numbers As Integer() = GetNumbers()
ShowNumbers(numbers)
End Sub
Private Function GetNumbers() As Integer()
Dim numbers As Integer() = {10, 20, 30}
Return numbers
End Function
Private Sub ShowNumbers(numbers As Integer())
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index) & " ")
Next
End Sub
' Output:
' 10
' 20
' 30
次の例では、GetNumbersMultiDim 関数は Integer(,)を返します。この配列型は型 Integerの次元配列です。ShowNumbersMultiDim の手順では Integer(,) の引数を受け取ります。
Public Sub ProcessMultidim()
Dim numbers As Integer(,) = GetNumbersMultidim()
ShowNumbersMultidim(numbers)
End Sub
Private Function GetNumbersMultidim() As Integer(,)
Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
Return numbers
End Function
Private Sub ShowNumbersMultidim(numbers As Integer(,))
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
End Sub
' Output
' 1 2
' 3 4
' 5 6
ジャグ配列
要素として配列またはジャグ配列とわかっている間に他の配列を格納する配列。ジャグ配列のジャグ配列の各要素には一つ以上の配列を表すことができます。アプリケーションのデータ構造は、2 次元の配列であっても四角形の 2 次元配列ではない場合があります。
次の例では、各要素が日の配列である月の配列があります。別の月によって日数が異なるため、要素は四角形の配列を形成しません。したがって、ジャグ配列は、多次元配列の代わりに使用されます。
' Declare the jagged array.
' The New clause sets the array variable to a 12-element
' array. Each element is an array of Double elements.
Dim sales()() As Double = New Double(11)() {}
' Set each element of the sales array to a Double
' array of the appropriate size.
For month As Integer = 0 To 11
Dim days As Integer =
DateTime.DaysInMonth(Year(Now), month + 1)
sales(month) = New Double(days - 1) {}
Next month
' Store values in each element.
For month As Integer = 0 To 11
Dim upper = sales(month).GetUpperBound(0)
For day = 0 To upper
sales(month)(day) = (month * 100) + day
Next
Next
長さ 0 の配列
要素を持たない配列は、長さの配列呼び出されます。長さの配列を保持する変数に値 Nothingはありません。次の例に示すように、要素を持たない配列を作成するには、-1 のように配列の次元の 1 つがを宣言します。
Dim twoDimensionalStrings(-1, 3) As String
次のような場合に、長さ 0 の配列を作成する必要があります。
NullReferenceException の例外を発生している場合に、コードは Array クラスのメンバーを、Length または Rankなど、アクセスまたは UBoundなどの Visual Basic 関数を呼び出します。
特別なケースですが、Nothing をチェックする必要性をなくすことによって利用側のコードを簡素化する場合。
コードは一つ以上のプロシージャにを長さゼロの配列に渡すように要求することも、一つ以上のプロシージャから長さの配列を返すアプリケーション プログラミング インターフェイス (API) と対話します。
配列のサイズ
配列のサイズは、そのすべての次元の長さの積です。これは、現在配列に含まれている要素の総数を表します。
次の例では 3 次元配列を宣言しています。
Dim prices(3, 4, 5) As Long
変数 prices の配列の全体のサイズは、(3 + 1) x (4 + 1) x (5 + 1) = 120 です。
配列のサイズは、Length プロパティを使用して確認できます。多次元配列の各次元の長さは、GetLength メソッドを使用して確認できます。
配列変数のサイズを変更するには、新しい配列オブジェクトを割り当てるか、ReDim ステートメントを使用します。
配列のサイズを扱う際に考慮する必要があるいくつかの点があります。
次元の長さ |
各次元のインデックスは 0 ベースであり、範囲は 0 から上限です。したがって、次元の長さは、その次元に対する宣言された上限よりも 1 だけ大きくなります。 |
長さの制限 |
配列のすべての次元の長さは、(2 ^ 31) - 1 である Integer データ型の最大値に制限されます。しかし、配列のサイズの総数も、システムで利用できるメモリによって制限されます。利用できる RAM の容量を超える配列を初期化する場合、共通言語ランタイムは OutOfMemoryException 例外をスローします。 |
サイズおよび要素のサイズ |
配列のサイズは、その要素のデータ型には依存しません。サイズは常に、使用するストレージのバイト数ではなく、要素の合計数を表します。 |
メモリの使用量 |
配列がメモリに格納される方法に関して、推測で行うのは安全ではありません。ストレージは、データ幅の異なるプラットフォームによって変わります。したがって、配列が同じであれば、32 ビットのシステムよりも、64 ビットのシステムのほうがより多くのメモリを使用します。配列を初期化するとき、システム構成に応じて、要素をできるだけ近くに集めるように、またはハードウェア本来の境界条件にすべてをそろえるように、共通言語ランタイム (CLR: Common Language Runtime) によってストレージが割り当てられます。また、配列は制御情報のためのストレージのオーバーヘッドを必要とします。このオーバーヘッドは、次元が追加されるごとに増加します。 |
配列の型および他の型
すべての配列にデータ型がありますが、要素のデータ型とは異なります。すべての配列を包括する 1 つのデータ型はありません。代わりに、配列のデータ型は、配列の次元数 (ランク) と配列の要素のデータ型によって決まります。ランクと要素のデータ型が一致しない限り、2 つの配列変数が同じデータ型を持つと見なされることはありません。配列の各次元の長さは、配列のデータ型には影響しません。
すべての配列は、System.Array クラスから継承しています。また、Array 型として変数を宣言できますが、Array 型の配列は作成できません。また、ReDim ステートメント (Visual Basic) は、Array 型として宣言された変数上では使用できません。これらの理由やタイプ セーフにより、すべての配列を、前の例の Integer などの特定の型として宣言することをお勧めします。
いくつかの方法で、配列またはその要素のいずれかのデータ型を知ることができます。
変数の Object.GetType メソッドを呼び出して、実行時型の変数の Type オブジェクトを取得できます。Type オブジェクトでは、プロパティおよびメソッドに詳細情報が保持されます。
変数を TypeName 関数に渡して、実行時型の名前が含まれる String を取得できます。
変数を VarType 関数に渡して、変数の型の分類を表す VariantType値を受け取ることができます。
TypeName 関数を呼び出して配列の型と配列の要素の型を確認する例を次に示します。配列の型は Integer(,) で、配列の要素の型は Integer です。
Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))
配列の代わりとしてのコレクション
配列は厳密に型指定されたオブジェクトの数を作成し、で使用する場合に最も役立ちます。コレクションはオブジェクトのグループで作業するより柔軟な方法を提供します。配列とは異なり、およびを使用するオブジェクトのグループはアプリケーションの変化に応じて、動的に拡大、合わせて縮小します。
配列のサイズを変更する必要がある場合、ReDim ステートメント (Visual Basic) を使用する必要があります。これを行うと、Visual Basic により新しい配列が作成され、前の配列が解放されて廃棄されます。これには、実行時間がかかります。したがって、操作を行う項目の数が頻繁に変更される場合、または必要な項目の最大数を予測できない場合、コレクションを使用するとパフォーマンスが向上します。
あるコレクションのキーを使用して、オブジェクトを取得できるように、コレクションに格納されたオブジェクトにキーを再配置できます。
次に、コレクションを 1 回のデータ型だけの要素が含まれている場合、System.Collections.Generic の名前空間のクラスの 1 を使用できます。ジェネリック コレクションでは、タイプ セーフが強制されるため、他のデータ型を追加することはできません。ジェネリック コレクションから要素を取得する場合は、データ型を判断したり、変換したりする必要はありません。
コレクションの詳細については、「コレクション (C# および Visual Basic)」を参照してください。
例
.NET Framework のジェネリック クラス System.Collections.Generic.List<T> を使用して、Customer オブジェクトの一覧コレクションを作成する例を次に示します。
' Define the class for a customer.
Public Class Customer
Public Property Name As String
' Insert code for other members of customer structure.
End Class
' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)
' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
' Insert code to perform validity check on newCust.
CustomerList.Add(newCust)
End Sub
' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
For Each cust As Customer In CustomerList
Debug.WriteLine(cust)
Next cust
End Sub
CustomerFile コレクションの宣言により、Customer 型だけの要素を含むことができることを指定します。また、200 要素分の初期容量も用意されています。AddNewCustomer プロシージャにより、新しい要素の有効性がチェックされ、コレクションに追加されます。PrintCustomers プロシージャでは、コレクションを走査し、その要素を表示するために、For Each ループが使用されます。
関連トピック
語句 |
定義 |
---|---|
配列のランクと次元について説明します。 |
|
配列に初期値を設定する方法について説明します。 |
|
配列の要素をアルファベット順に並べ替える方法について説明します。 |
|
配列を別の配列変数に代入するときの手順と規則を説明します。 |
|
配列を使用しているときに発生する一般的な問題について説明します。 |