Visual Basic における配列Arrays in Visual Basic

配列と呼ばれるものの値のセットは、要素、互いに論理的に関連します。An array is a set of values, which are termed elements, that are logically related to each other. たとえば、配列が学校; の各学年の生徒の数の構成可能性があります。配列の各要素は、1 つ学年の生徒の数です。For example, an array may consist of the number of students in each grade in a grammar school; each element of the array is the number of students in a single grade. 同様に、配列が、クラスの学生の成績のあります。配列の各要素は、1 つのレベルです。Similarly, an array may consist of a student's grades for a class; each element of the array is a single grade.

各データ項目を格納する個々 の変数を可能になります。It is possible individual variables to store each of our data items. たとえば場合は、アプリケーションは、学生の成績を分析し別個の変数の各生徒の成績など、使用できるenglishGrade1englishGrade2など。このアプローチでは、次の 3 つの主要な制限があります。For example, if our application analyzes student grades, we can use a separate variable for each student's grade, such as englishGrade1, englishGrade2, etc. This approach has three major limitations:

  • デザイン時に認識する成績の数だけ処理する必要があります。We have to know at design time exactly how many grades we have to handle.
  • 多数の成績を迅速に処理することは、扱いにくくなります。Handling large numbers of grades quickly becomes unwieldy. さらをアプリケーションに重大なバグがある可能性が高くなります。This in turn makes an application much more likely to have serious bugs.
  • 保守が困難になります。It is difficult to maintain. 新しい各学年を追加するには、こと、アプリケーション変更、再コンパイル、および再デプロイが必要です。Each new grade that we add requires that the application be modified, recompiled, and redeployed.

配列を使用すると、同じ名前で、これらの関連する値を参照してくださいし、呼び出される番号を使用して、インデックスまたは添字配列内の位置に基づいて個々 の要素を識別します。By using an array, you can refer to these related values by the same name, and use a number that’s called an index or subscript to identify an individual element based on its position in the array. 配列内の要素の合計数より 1 小さい値を 0 から配列の範囲のインデックス。The indexes of an array range from 0 to one less than the total number of elements in the array. Visual Basic 構文を使用して、配列のサイズを定義する、配列内の要素の合計数ではない、その最も大きいインデックスを指定します。When you use Visual Basic syntax to define the size of an array, you specify its highest index, not the total number of elements in the array. 単位として配列を使用して、その要素を反復処理する機能を正確にデザイン時に含まれる数の要素を把握しなくてを解放します。 します。You can work with the array as a unit, and the ability to iterate its elements frees you from needing to know exactly how many elements it contains at design time.

説明する前に、簡単な例をいくつか紹介します。Some quick examples before explanation:

' Declare a single-dimension array of 5 numbers.
Dim numbers(4) As Integer

'Declare a single-dimension array and set its 4 values.
Dim numbers = New Integer() {1, 2, 4, 8}

' Change the size of an existing array to 16 elements and retain the current values.
ReDim Preserve numbers(15)

' Redefine the size of an existing array and reset the values.
ReDim numbers(15)

' Declare a 6 x 6 multidimensional array.
Dim matrix(5, 5) As Double

' Declare a 4 x 3 multidimensional array and set array element values.
Dim matrix = New Integer(3, 2) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}

' Declare a jagged array
Dim sales()() As Double = New Double(11)() {}

単純な配列の配列要素Array elements in a simple array

という名前の配列を作成しましょうstudents学校の各学年の生徒の数を格納します。Let's create an array named students to store the number of students in each grade in a grammar school. 要素のインデックスの範囲は 0 から 6 までです。The indexes of the elements range from 0 through 6. この配列の使用は、7 つの変数を宣言するよりも簡単です。Using this array is simpler than declaring seven variables.

次の図は、students配列。The following illustration shows the students array. 配列の各要素は、次のとおりです。For each element of the array:

  • 要素のインデックスは、学年を表します (インデックス 0 は幼稚園を表します)。The index of the element represents the grade (index 0 represents kindergarten).

  • 要素に含まれている値は、その学年の生徒の数を表します。The value that’s contained in the element represents the number of students in that grade.

生徒数の配列を示す図

次の例には、作成し、配列を使用して Visual Basic のコードが含まれています。The following example contains the Visual Basic code that creates and uses the array:


Module SimpleArray
   Public Sub Main()
      ' Declare an array with 7 elements.
      Dim students(6) As Integer

      ' Assign values to each element.
      students(0) = 23
      students(1) = 19
      students(2) = 21
      students(3) = 17
      students(4) = 19
      students(5) = 20
      students(6) = 22
      
      ' Display the value of each element.
      For ctr As Integer = 0 To 6
         Dim grade As String = If(ctr = 0, "kindergarten", $"grade {ctr}")
         Console.WriteLine($"Students in {grade}: {students(ctr)}")
      Next
   End Sub
End Module
' The example displays the following output:
'     Students in kindergarten: 23
'     Students in grade 1: 19
'     Students in grade 2: 21
'     Students in grade 3: 17
'     Students in grade 4: 19
'     Students in grade 5: 20
'     Students in grade 6: 22

この例は次の 3 つを行います。The example does three things:

  • 宣言をstudents7 つの要素の配列。It declares a students array with seven elements. 6配列の宣言が配列の最後のインデックスを示します。 これは、1 つは、配列内の要素の数よりも小さい。The number 6 in the array declaration indicates the last index in the array; it is one less than the number of elements in the array.
  • 配列内の各要素に値を割り当てます。It assigns values to each element in the array. 配列名を使用して、かっこで囲まれた個々 の要素のインデックスを含む要素にアクセスします。Array elements are accessed by using the array name and including the index of the individual element in parentheses.
  • 配列の各値が一覧表示します。It lists each value of the array. この例では、 For インデックス番号で、配列の各要素にアクセスするステートメント。The example uses a For statement to access each element of the array by its index number.

students 1 つのインデックスを使用しているために、上記の例では、配列は 1 次元配列。The students array in the preceding example is a one-dimensional array because it uses one index. 1 つ以上のインデックスまたは添字を使用する配列と呼びます多次元します。An array that uses more than one index or subscript is called multidimensional. 詳細については、この記事の残りの部分を参照してくださいとVisual Basic で配列の次元します。For more information, see the rest of this article and Array Dimensions in Visual Basic.

配列の作成Creating an array

いくつかの方法では、配列のサイズを定義できます。You can define the size of an array in several ways:

  • 配列が宣言されている場合は、サイズを指定できます。You can specify the size when the array is declared:

    ' Declare an array with 10 elements.
    Dim cargoWeights(9) As Double               
    ' Declare a 24 x 2 array.
    Dim hourlyTemperatures(23, 1) As Integer
    ' Declare a jagged array with 31 elements.
    Dim januaryInquiries(30)() As String
    
  • 使用することができます、New句が作成されたときに、配列のサイズを指定します。You can use a New clause to supply the size of an array when it’s created:

    ' Declare an array with 10 elements.
    Dim cargoWeights() As Double = New Double(9) {} 
    ' Declare a 24 x 2 array.
    Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {}
    ' Declare a jagged array with 31 elements. 
    Dim januaryInquiries()() As String = New String(30)() {}
    

使用してサイズを再定義できますを既存の配列がある場合、 ReDim ステートメント。If you have an existing array, you can redefine its size by using the ReDim statement. 指定することができます、ReDimステートメントが、配列内にある値を保持または空の配列を作成することを指定することができます。You can specify that the ReDim statement keep the values that are in the array, or you can specify that it create an empty array. 次に、 ReDim ステートメントを使用して既存の配列のサイズを変更する例をいくつか示します。The following example shows different uses of the ReDim statement to modify the size of an existing array.

' Assign a new array size and retain the current values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

詳細については、次を参照してください。、 ReDim ステートメントします。For more information, see the ReDim Statement.

配列内の値を格納します。Storing values in an array

配列のそれぞれの位置には、 Integer型のインデックスを使用してアクセスできます。You can access each location in an array by using an index of type Integer. かっこで囲まれたインデックスを使用して配列のそれぞれの位置を参照することで、配列の値を格納および取得することができます。You can store and retrieve values in an array by referencing each array location by using its index enclosed in parentheses. 多次元配列のインデックスは、コンマ (,) で区切られます。Indexes for multidimensional arrays are separated by commas (,). 配列の次元ごとに 1 つのインデックスが必要です。You need one index for each array dimension.

次の例では、配列の値を取得および保存されるいくつかのステートメントを示します。The following example shows some statements that store and retrieve values in arrays.


Module Example
   Public Sub Main()
      ' Create a 10-element integer array.
      Dim numbers(9) As Integer
      Dim value As Integer = 2
        
      ' Write values to it.
      For ctr As Integer = 0 To 9
         numbers(ctr) = value
         value *= 2
      Next
        
      ' Read and sum the array values.  
      Dim sum As Integer
      For ctr As Integer = 0 To 9
         sum += numbers(ctr)
      Next
      Console.WriteLine($"The sum of the values is {sum:N0}")
    End Sub
End Module
' The example displays the following output:
'     The sum of the values is 2,046

配列リテラルの配列への取り込みPopulating an array with array literals

配列リテラルを使用すると、同時に作成する初期値のセットを含む配列を設定できます。By using an array literal, you can populate an array with an initial set of values at the same time that you create it. 配列リテラルは、中かっこ ({}) で囲んだ値のコンマ区切りの一覧で構成されます。An array literal consists of a list of comma-separated values that are enclosed in braces ({}).

配列リテラルを使用して配列を作成する場合、配列の型を指定するか、型の推定を使用して配列の型を決定することができます。When you create an array by using an array literal, you can either supply the array type or use type inference to determine the array type. 次の例では、両方のオプションを示します。The following example shows both options.

' Array literals with explicit type definition.
Dim numbers = New Integer() {1, 2, 4, 8}
' Array literals with type inference.
Dim doubles = {1.5, 2, 9.9, 18}
' Array literals with explicit type definition.
Dim articles() As String = { "the", "a", "an" }

' Array literals with explicit widening type definition.
Dim values() As Double = { 1, 2, 3, 4, 5 }

型の推定を使用する場合、配列の型はによって決まります、優先型リテラル値の一覧にします。When you use type inference, the type of the array is determined by the dominant type in the list of literal values. 主要な型は、配列内の他のすべての型が拡大変換できる型です。The dominant type is the type to which all other types in the array can widen. この一意の型を特定できない場合、最も優先度の高い型は、配列内の他のすべての型から縮小変換できる一意の型になります。If this unique type can’t be determined, the dominant type is the unique type to which all other types in the array can narrow. これらの一意の型をどちらも特定できない場合は、 Objectが最も優先度の高い型になります。If neither of these unique types can be determined, the dominant type is Object. たとえば、配列リテラルに指定された値の一覧に Integer型、 Long型、および Double型の値が含まれている場合、結果の配列の型は Doubleです。For example, if the list of values that’s supplied to the array literal contains values of type Integer, Long, and Double, the resulting array is of type Double. IntegerLongにのみ拡大変換DoubleDoubleは、主要な型です。Because Integer and Long widen only to Double, Double is the dominant type. 詳細については、「 Widening and Narrowing Conversions」を参照してください。For more information, see Widening and Narrowing Conversions.

注意

型の推定は、型のメンバーのローカル変数として定義されている配列に対してのみ使用できます。You can use type inference only for arrays that are defined as local variables in a type member. クラス レベルの配列リテラルで定義されている配列がの型は、明示的な型定義がない場合は、Object[]します。If an explicit type definition is absent, arrays defined with array literals at the class level are of type Object[]. 詳細については、次を参照してください。ローカル型推論します。For more information, see Local type inference.

前の例を定義する注values型の配列としてDouble場合でも、すべての配列リテラルが型Integerします。Note that the previous example defines values as an array of type Double even though all the array literals are of type Integer. この配列を作成するには、配列リテラル内の値に拡大変換することができますのでDouble値。You can create this array because the values in the array literal can widen to Double values.

作成してを使用して多次元配列を設定できる配列リテラルを入れ子になったします。You can also create and populate a multidimensional array by using nested array literals. 入れ子になった配列リテラルには、結果の配列で一貫性のあるディメンションの数が必要です。Nested array literals must have a number of dimensions that’s consistent with the resulting array. 次の例では、入れ子になった配列リテラルを使用して、整数の 2 次元配列を作成します。The following example creates a two-dimensional array of integers by using nested array literals.

' Create and populate a 2 x 2 array.
Dim grid1 = {{1, 2}, {3, 4}}
' Create and populate a 2 x 2 array with 3 elements.
Dim grid2(,) = {{1, 2}, {3, 4}, {5, 6}}

入れ子になった配列リテラルを使用して配列を作成し、入れ子になった配列リテラル内の要素の数が一致しない場合、エラーが発生します。When using nested array literals to create and populate an array, an error occurs if the number of elements in the nested array literals don't match. エラーは、配列リテラルより次元数が異なるが、配列変数を明示的に宣言する場合にも発生します。An error also occurs if you explicitly declare the array variable to have a different number of dimensions than the array literals.

1 次元配列にすることができますと同様、入れ子になった配列リテラルに多次元配列を作成するときに型の推定に依存することができます。Just as you can for one-dimensional arrays, you can rely on type inference when creating a multidimensional array with nested array literals. 推定された型が、主要なすべての入れ子レベルのすべての配列リテラル内のすべての値の型です。The inferred type is the dominant type for all the values in all the array literals for all nesting level. 次の例は、2 次元配列の型を作成Double[,]型の値からIntegerDoubleします。The following example creates a two-dimensional array of type Double[,] from values that are of type Integer and Double.

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

その他の例では、次を参照してください。方法。Visual Basic で配列変数を初期化します。For additional examples, see How to: Initialize an Array Variable in Visual Basic.

配列を反復処理します。Iterating through an array

最大最小のインデックスとは、最上位から、配列内の各要素にアクセスする配列を反復処理するときに、最下位にします。When you iterate through an array, you access each element in the array from the lowest index to the highest or from the highest to the lowest. 通常、いずれかを使用して、をしています.次のステートメントのまたはごとにしています.次のステートメントの配列の要素を反復処理します。Typically, use either the For...Next Statement or the For Each...Next Statement to iterate through the elements of an array. 呼び出すことができますが、配列の上限がわからないときに、Array.GetUpperBoundインデックスの最大値を取得します。When you don't know the upper bounds of the array, you can call the Array.GetUpperBound method to get the highest value of the index. 最小のインデックス値がほぼ常に 0 を呼び出すことができます、Array.GetLowerBoundインデックスの最小値を取得します。Although lowest index value is almost always 0, you can call the Array.GetLowerBound method to get the lowest value of the index.

次の例を使用して、1 次元配列を反復処理、 For...Next ステートメント。The following example iterates through a one-dimensional array by using the For...Next statement.


Module IterateArray
   Public Sub Main()
      Dim numbers = {10, 20, 30}

      For index = 0 To numbers.GetUpperBound(0)
         Console.WriteLine(numbers(index))
      Next
   End Sub
End Module
' The example displays the following output:
'  10
'  20
'  30

次の例を使用して、多次元配列を反復処理を For...Next ステートメント。The following example iterates through a multidimensional array by using a For...Next statement. GetUpperBound メソッドには、次元を指定するパラメーターがあります。The GetUpperBound method has a parameter that specifies the dimension. GetUpperBound(0) 最初の次元の最も大きいインデックスを返しますとGetUpperBound(1)2 番目の次元の最も大きいインデックスを返します。GetUpperBound(0) returns the highest index of the first dimension, and GetUpperBound(1) returns the highest index of the second dimension.


Module IterateArray
   Public Sub Main()
      Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

      For index0 = 0 To numbers.GetUpperBound(0)
         For index1 = 0 To numbers.GetUpperBound(1)
            Console.Write($"{numbers(index0, index1)} ")
         Next
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
' Output 
'  1 2 
'  3 4 
'  5 6

次の例では、ごとにしています.次のステートメントの1 次元配列と、2 次元配列を反復処理します。The following example uses a For Each...Next Statementto iterate through a one-dimensional array and a two-dimensional array.


Module IterateWithForEach
   Public Sub Main()
      ' Declare and iterate through a one-dimensional array.
      Dim numbers1 = {10, 20, 30}
      
      For Each number In numbers1
         Console.WriteLine(number)
      Next
      Console.WriteLine()
      
      Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

      For Each number In numbers
         Console.WriteLine(number)
      Next
   End Sub
End Module
' The example displays the following output:
'  10
'  20
'  30
'
'  1
'  2
'  3
'  4
'  5
'  6

配列のサイズArray size

配列のサイズは、そのすべての次元の長さの積です。The size of an array is the product of the lengths of all its dimensions. これは、現在配列に含まれている要素の総数を表します。It represents the total number of elements currently contained in the array. たとえば、次の例は、各ディメンション内の 4 つの要素を持つ 2 次元配列を宣言します。For example, the following example declares a 2-dimensional array with four elements in each dimension. 例の出力を示しています、配列のサイズは 16 ((3 + 1) または * (3 + 1)。As the output from the example shows, the array's size is 16 (or (3 + 1) * (3 + 1).


Module Example
   Public Sub Main()
      Dim arr(3, 3) As Integer
      Console.WriteLine(arr.Length)     
   End Sub
End Module
' The example displays the following output:
'     16

注意

配列のサイズには、この説明は、ジャグ配列には適用されません。This discussion of array size does not apply to jagged arrays. ジャグ配列およびジャグ配列のサイズを判断する方法については、次を参照してください。、ジャグ配列セクション。For information on jagged arrays and determining the size of a jagged array, see the Jagged arrays section.

配列のサイズは、Array.Length プロパティを使用して確認できます。You can find the size of an array by using the Array.Length property. 使用して多次元配列の各次元の長さを見つけることができます、Array.GetLengthメソッド。You can find the length of each dimension of a multidimensional array by using the Array.GetLength method.

サイズを変更できる配列変数を新しい配列のオブジェクトを割り当てることで、またはを使用して、 ReDimステートメントステートメント。You can resize an array variable by assigning a new array object to it or by using the ReDim Statement statement. 次の例では、 ReDim 51 要素を配列に 100 要素の配列を変更するステートメント。The following example uses the ReDim statement to change a 100-element array to a 51-element array.


Module Example
   Public Sub Main()
      Dim arr(99) As Integer
      Console.WriteLine(arr.Length)
      
      Redim arr(50)
      Console.WriteLine(arr.Length)
   End Sub
End Module
' The example displays the following output:
'     100
'     51

 

配列のサイズを扱う際に考慮する必要がある点がいくつかあります。There are several things to keep in mind when dealing with the size of an array.

次元の長さDimension Length 各次元のインデックスには 0 から上限の範囲、つまり 0 から始まります。The index of each dimension is 0-based, which means it ranges from 0 to its upper bound. したがって、特定の次元の長さは、そのディメンションの宣言された上限よりも大きい値のいずれかです。Therefore, the length of a given dimension is one greater than the declared upper bound of that dimension.
長さの制限Length Limits 配列のすべての次元の長さの最大値に制限されて、Integerはデータ型は、Int32.MaxValueまたは (2 ^31) - 1。The length of every dimension of an array is limited to the maximum value of the Integer data type, which is Int32.MaxValue or (2 ^ 31) - 1. しかし、配列のサイズの総数も、システムで利用できるメモリによって制限されます。However, the total size of an array is also limited by the memory available on your system. 使用可能なメモリの容量を超える配列を初期化しようとした場合は、ランタイム、OutOfMemoryExceptionします。If you attempt to initialize an array that exceeds the amount of available memory, the runtime throws an OutOfMemoryException.
サイズおよび要素のサイズSize and Element Size 配列のサイズは、その要素のデータ型には依存しません。An array's size is independent of the data type of its elements. サイズは、常にメモリ内で使用されるバイト数ではなく、要素の合計数を表します。The size always represents the total number of elements, not the number of bytes that they consume in memory.
メモリの使用量Memory Consumption 配列がどのようにメモリに格納されるかに関して、前提を置くことは安全ではありません。It is not safe to make any assumptions regarding how an array is stored in memory. ストレージは、プラットフォームのデータ幅が異なると変わります。したがって、同じ配列でも、32 ビットのシステムよりも 64 ビットのシステムの方が多くのメモリを使用します。Storage varies on platforms of different data widths, so the same array can consume more memory on a 64-bit system than on a 32-bit system. 配列を初期化すると、システム構成に応じて、要素をできるだけ近くに集めるように、またはすべてがハードウェア自体の境界に合致するように、共通言語ランタイム (CLR: Common Language Runtime) によってストレージが割り当てられます。Depending on system configuration when you initialize an array, the common language runtime (CLR) can assign storage either to pack elements as close together as possible, or to align them all on natural hardware boundaries. また、配列は制御情報のためにストレージのオーバーヘッドを必要とします。このオーバーヘッドは、次元が追加されるごとに増加します。Also, an array requires a storage overhead for its control information, and this overhead increases with each added dimension.

配列型The array type

すべての配列が、データ型のことで、その要素のデータ型とは異なります。Every array has a data type, which differs from the data type of its elements. すべての配列を包括する 1 つのデータ型はありません。There is no single data type for all arrays. 代わりに、配列のデータ型は、配列の次元数 ( ランク) と配列の要素のデータ型によって決まります。Instead, the data type of an array is determined by the number of dimensions, or rank, of the array, and the data type of the elements in the array. のみがある場合に同じランクを入力し、その要素が同じデータ型を持つ 2 つの配列変数は、同じデータ。Two array variables are of the same data type only when they have the same rank and their elements have the same data type. 配列の次元の長さは、配列のデータ型には影響しません。The lengths of the dimensions of an array do not influence the array data type.

すべての配列は、System.Array クラスから継承しています。また、Array 型として変数を宣言できますが、Array 型の配列は作成できません。Every array inherits from the System.Array class, and you can declare a variable to be of type Array, but you cannot create an array of type Array. たとえば、次のコードを宣言しますが、arr型の変数をArrayを呼び出すと、Array.CreateInstance配列、配列の型をインスタンス化するメソッドは、object[] のことがわかった。For example, although the following code declares the arr variable to be of type Array and calls the Array.CreateInstance method to instantiate the array, the array's type proves to be Object[].


Module Example
   Public Sub Main()
      Dim arr As Array = Array.CreateInstance(GetType(Object), 19)
      Console.WriteLine(arr.Length)
      Console.WriteLine(arr.GetType().Name)
   End Sub
End Module
' The example displays the following output:
'     19
'     Object[]

また、ReDim ステートメント は、Array 型として宣言された変数上では使用できません。Also, the ReDim Statement cannot operate on a variable declared as type Array. これらの理由やタイプ セーフでは、特定の種類としてすべての配列を宣言することをお勧めします。For these reasons, and for type safety, it is advisable to declare every array as a specific type.

いくつかの方法で、配列またはその要素のいずれかのデータ型を知ることができます。You can find out the data type of either an array or its elements in several ways.

  • 呼び出すことができます、GetTypeメソッドを取得する変数をType変数の実行時の型を表すオブジェクト。You can call the GetType method on the variable to get a Type object that represents the run-time type of the variable. Type オブジェクトでは、プロパティおよびメソッドに詳細情報が保持されます。The Type object holds extensive information in its properties and methods.
  • 変数を渡すことができます、TypeNameを取得する関数をString実行時の型の名前に置き換えます。You can pass the variable to the TypeName function to get a String with the name of run-time type.

次の例では、両方は、GetTypeメソッドとTypeName配列の型を決定する関数。The following example calls the both the GetType method and the TypeName function to determine the type of an array. 配列型はByte(,)します。The array type is Byte(,). なお、Type.BaseTypeもプロパティでは、バイト配列の基本型があることを示します、Arrayクラス。Note that the Type.BaseType property also indicates that the base type of the byte array is the Array class.


Module Example
   Public Sub Main()
      Dim bytes(9,9) As Byte
      Console.WriteLine($"Type of {nameof(bytes)} array: {bytes.GetType().Name}")
      Console.WriteLine($"Base class of {nameof(bytes)}: {bytes.GetType().BaseType.Name}")
      Console.WriteLine()
      Console.WriteLine($"Type of {nameof(bytes)} array: {TypeName(bytes)}")
   End Sub
End Module
' The example displays the following output:
' Type of bytes array: Byte[,]
' Base class of bytes: Array
' 
' Type of bytes array: Byte(,)


戻り値およびパラメーターとしての配列Arrays as return values and parameters

Function プロシージャから配列を返すには、Function ステートメントの戻り値の型として配列のデータ型と次元数を指定します。To return an array from a Function procedure, specify the array data type and the number of dimensions as the return type of the Function Statement. 関数内で、同じデータ型と次元数を持つローカルの配列変数を宣言します。Within the function, declare a local array variable with same data type and number of dimensions. Return ステートメントには、かっこを使用せずにローカルの配列変数を含めます。In the Return Statement, include the local array variable without parentheses.

配列を Sub プロシージャまたは Function プロシージャのパラメーターとして指定するには、パラメーターを配列として定義して、データ型と次元数を指定します。To specify an array as a parameter to a Sub or Function procedure, define the parameter as an array with a specified data type and number of dimensions. プロシージャの呼び出しでは、配列変数を同じデータ型と次元数を渡します。In the call to the procedure, pass an array variable with the same data type and number of dimensions.

次の例では、GetNumbers関数が返される、 Integer()、型の 1 次元配列Integerします。In the following example, the GetNumbers function returns an Integer(), a one-dimensional array of type Integer. ShowNumbers プロシージャは、 Integer() の引数を受け取ります。The ShowNumbers procedure accepts an Integer() argument.


Module ReturnValuesAndParams
   Public Sub Main()
      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)
         Console.WriteLine($"{numbers(index)} ")
      Next
   End Sub
End Module
' The example displays the following output:
'   10
'   20
'   30
    

次の例では、GetNumbersMultiDim関数が返される、 Integer(,)、型の 2 次元配列Integerします。In the following example, the GetNumbersMultiDim function returns an Integer(,), a two-dimensional array of type Integer. ShowNumbersMultiDim プロシージャは、 Integer(,) の引数を受け取ります。The ShowNumbersMultiDim procedure accepts an Integer(,) argument.


Module Example
   Public Sub Main()
      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)
            Console.Write($"{numbers(index0, index1)} ")
         Next
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
'     1 2
'     3 4
'     5 6

ジャグ配列Jagged arrays

アプリケーションのデータ構造は、2 次元の配列であっても四角形の 2 次元配列ではない場合があります。Sometimes the data structure in your application is two-dimensional but not rectangular. たとえば、月の毎日の最高気温のデータを格納するのに配列を使用可能性があります。For example, you might use an array to store data about the high temperature of each day of the month. 配列の最初の次元は、1 か月を表しますが、2 番目の次元は、日数を表すし、1 か月の日数は一様ではないです。The first dimension of the array represents the month, but the second dimension represents the number of days, and the number of days in a month is not uniform. Aジャグ配列と呼ばれることも、配列の配列、このようなシナリオに適しています。A jagged array, which is also called an array of arrays, is designed for such scenarios. ジャグ配列は、配列要素も配列です。A jagged array is an array whose elements are also arrays. ジャグ配列と、ジャグ配列の各要素は、1 次元でも多次元でもかまいません。A jagged array and each element in a jagged array can have one or more dimensions.

次の例では、数か月の各要素が日の配列の配列を使用します。The following example uses an array of months, each element of which is an array of days. 異なる月の日数の数が異なるため、ジャグ配列を使用します。The example uses a jagged array because different months have different numbers of days. この例では、ジャグ配列を作成し、値を割り当てる、取得、およびその値を表示する方法を示します。The example shows how to create a jagged array, assign values to it, and retrieve and display its values.

Imports System.Globalization

Module JaggedArray
   Public Sub Main()
      ' Declare the jagged array of 12 elements. Each element is an array of Double.
      Dim sales(11)() As Double
      ' Set each element of the sales array to a Double array of the appropriate size.
      For month As Integer = 0 To 11
         ' The number of days in the month determines the appropriate size.
         Dim daysInMonth As Integer =
            DateTime.DaysInMonth(Year(Now), month + 1)
         sales(month) = New Double(daysInMonth - 1) {}
      Next 

      ' Store values in each element.
      For month As Integer = 0 To 11
         For dayOfMonth = 0 To sales(month).GetUpperBound(0)
            sales(month)(dayOfMonth) = (month * 100) + dayOfMonth
         Next
      Next

      ' Retrieve and display the array values.
      Dim monthNames = DateTimeFormatInfo.CurrentInfo.AbbreviatedMonthNames
      ' Display the month names.
      Console.Write("    ")
      For ctr = 0 To sales.GetUpperBound(0)
         Console.Write($" {monthNames(ctr)}   ")
      Next   
      Console.WriteLine()
      ' Display data for each day in each month.
      For dayInMonth = 0 To 30
         Console.Write($"{dayInMonth + 1,2}.  ")
         For monthNumber = 0 To sales.GetUpperBound(0)
            If dayInMonth > sales(monthNumber).GetUpperBound(0) Then 
               Console.Write("       ")
            Else
               Console.Write($"{sales(monthNumber)(dayInMonth),-5}  ")
            End If
         Next   
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
'      Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
'  1.  0      100    200    300    400    500    600    700    800    900    1000   1100
'  2.  1      101    201    301    401    501    601    701    801    901    1001   1101
'  3.  2      102    202    302    402    502    602    702    802    902    1002   1102
'  4.  3      103    203    303    403    503    603    703    803    903    1003   1103
'  5.  4      104    204    304    404    504    604    704    804    904    1004   1104
'  6.  5      105    205    305    405    505    605    705    805    905    1005   1105
'  7.  6      106    206    306    406    506    606    706    806    906    1006   1106
'  8.  7      107    207    307    407    507    607    707    807    907    1007   1107
'  9.  8      108    208    308    408    508    608    708    808    908    1008   1108
' 10.  9      109    209    309    409    509    609    709    809    909    1009   1109
' 11.  10     110    210    310    410    510    610    710    810    910    1010   1110
' 12.  11     111    211    311    411    511    611    711    811    911    1011   1111
' 13.  12     112    212    312    412    512    612    712    812    912    1012   1112
' 14.  13     113    213    313    413    513    613    713    813    913    1013   1113
' 15.  14     114    214    314    414    514    614    714    814    914    1014   1114
' 16.  15     115    215    315    415    515    615    715    815    915    1015   1115
' 17.  16     116    216    316    416    516    616    716    816    916    1016   1116
' 18.  17     117    217    317    417    517    617    717    817    917    1017   1117
' 19.  18     118    218    318    418    518    618    718    818    918    1018   1118
' 20.  19     119    219    319    419    519    619    719    819    919    1019   1119
' 21.  20     120    220    320    420    520    620    720    820    920    1020   1120
' 22.  21     121    221    321    421    521    621    721    821    921    1021   1121
' 23.  22     122    222    322    422    522    622    722    822    922    1022   1122
' 24.  23     123    223    323    423    523    623    723    823    923    1023   1123
' 25.  24     124    224    324    424    524    624    724    824    924    1024   1124
' 26.  25     125    225    325    425    525    625    725    825    925    1025   1125
' 27.  26     126    226    326    426    526    626    726    826    926    1026   1126
' 28.  27     127    227    327    427    527    627    727    827    927    1027   1127
' 29.  28            228    328    428    528    628    728    828    928    1028   1128
' 30.  29            229    329    429    529    629    729    829    929    1029   1129
' 31.  30            230           430           630    730           930           1130

前の例では、要素ごとの単位でのジャグ配列に値を割り当ててを使用して、For...Nextループします。The previous example assigns values to the jagged array on an element-by-element basis by using a For...Next loop. 入れ子になった配列リテラルを使用してジャグ配列の要素に値を割り当てることもできます。You can also assign values to the elements of a jagged array by using nested array literals. ただし、使用しようとすると、入れ子になった配列リテラル (たとえば、 Dim valuesjagged = {{1, 2}, {2, 3, 4}}) コンパイラ エラーが発生BC30568します。However, the attempt to use nested array literals (for example, Dim valuesjagged = {{1, 2}, {2, 3, 4}}) generates compiler error BC30568. エラーを修正するには、内側の配列リテラルをかっこで囲みます。To correct the error, enclose the inner array literals in parentheses. かっこは、強制的に配列のリテラル式を評価して、次の例では、外側の配列リテラルには、結果として得られる値が使用されます。The parentheses force the array literal expression to be evaluated, and the resulting values are used with the outer array literal, as the following example shows.


Module Example
   Public Sub Main()
      Dim values1d = { 1, 2, 3 }
      Dim values2d = {{1, 2}, {2, 3}, {3, 4}}
      Dim valuesjagged = {({1, 2}), ({2, 3, 4})}
   End Sub
End Module

ジャグ配列は、配列の要素を格納する 1 次元配列です。A jagged array is a one-dimensional array whose elements contain arrays. そのため、Array.LengthプロパティおよびArray.GetLength(0)メソッドは、1 次元の配列要素の数を返すとArray.GetLength(1)がスローされます、IndexOutOfRangeExceptionジャグ配列が多次元ではないためです。Therefore, the Array.Length property and the Array.GetLength(0) method return the number of elements in the one-dimensional array, and Array.GetLength(1) throws an IndexOutOfRangeException because a jagged array is not multidimensional. 各サブ配列の値を取得することによって各サブ配列の要素の数を決定するArray.Lengthプロパティ。You determine the number of elements in each subarray by retrieving the value of each subarray's Array.Length property. 次の例では、ジャグ配列の要素の数を決定する方法を示します。The following example illustrates how to determine the number of elements in a jagged array.


Module Example
   Public Sub Main()
      Dim jagged = { ({1, 2}), ({2, 3, 4}), ({5, 6}), ({7, 8, 9, 10}) }
      Console.WriteLine($"The value of jagged.Length: {jagged.Length}.")
      Dim total = jagged.Length
      For ctr As Integer = 0 To jagged.GetUpperBound(0)
         Console.WriteLine($"Element {ctr + 1} has {jagged(ctr).Length} elements.") 
         total += jagged(ctr).Length 
      Next
      Console.WriteLine($"The total number of elements in the jagged array: {total}")
   End Sub
End Module
' The example displays the following output:
'     The value of jagged.Length: 4.
'     Element 1 has 2 elements.
'     Element 2 has 3 elements.
'     Element 3 has 2 elements.
'     Element 4 has 4 elements.
'     The total number of elements in the jagged array: 15

長さ 0 の配列Zero-length arrays

Visual Basic は初期化されていない配列間で区別されます (値が配列Nothing) と長さ 0 の配列または空の配列 (配列の要素を持たない)。初期化されていない配列は、いずれかの次元がされていないまたは任意の値がそれに割り当てられます。Visual Basic differentiates between a uninitialized array (an array whose value is Nothing) and a zero-length array or empty array (an array that has no elements.) An uninitialized array is one that has not been dimensioned or had any values assigned to it. 例:For example:

Dim arr() As String

長さ 0 の配列は、-1 のディメンションと宣言されます。A zero-length array is declared with a dimension of -1. 例:For example:

Dim arrZ(-1) As String

次のような場合に、長さ 0 の配列を作成する必要があります。You might need to create a zero-length array under the following circumstances:

  • リスクを負わず、NullReferenceException例外、コードのメンバーにアクセスする必要があります、Arrayクラスなど、LengthまたはRank、または Visual Basic の関数を呼び出すUBoundします。Without risking a NullReferenceException exception, your code must access members of the Array class, such as Length or Rank, or call a Visual Basic function such as UBound.

  • 確認する必要がない単純なコードを保持するNothing特殊なケースとして。You want to keep your code simple by not having to check for Nothing as a special case.

  • コードで、長さ 0 の配列を 1 つ以上のプロシージャに渡す必要があるアプリケーション プログラミング インターフェイス (API: Application Programming Interface) とやり取りする場合、または API の 1 つ以上のプロシージャから長さ 0 の配列が返される場合。Your code interacts with an application programming interface (API) that either requires you to pass a zero-length array to one or more procedures or returns a zero-length array from one or more procedures.

配列の分割Splitting an array

場合によっては、複数の配列に 1 つの配列を分割する必要があります。In some cases, you may need to split a single array into multiple arrays. これには、配列が分割されるポイントを識別して、2 つ以上の個別の配列に配列を送信が含まれます。This involves identifying the point or points at which the array is to be split, and then spitting the array into two or more separate arrays.

注意

このセクションでは、何らかの区切り記号に基づいて文字列配列に 1 つの文字列を分割は説明しません。This section does not discuss splitting a single string into a string array based on some delimiter. 文字列の分割方法の詳細については、次を参照してください。、String.Splitメソッド。For information on splitting a string, see the String.Split method.

配列に分割するための最も一般的な条件は次のとおりです。The most common criteria for splitting an array are:

  • 配列の要素数。The number of elements in the array. たとえば、数と等しい部分約を指定した要素数を超える配列に分割します。For example, you might want to split an array of more than a specified number of elements into a number of approximately equal parts. このため、いずれかによって返される値を使用することができます、Array.LengthまたはArray.GetLengthメソッド。For this purpose, you can use the value returned by either the Array.Length or Array.GetLength method.

  • 配列の位置を示す区切り記号として機能する要素の値を分割する必要があります。The value of an element, which serves as a delimiter that indicates where the array should be split. 呼び出すことによって特定の値を検索することができます、Array.FindIndexArray.FindLastIndexメソッド。You can search for a specific value by calling the Array.FindIndex and Array.FindLastIndex methods.

呼び出して個々 の配列を作成できますし、配列を分割する位置のインデックス、インデックスを特定した後、Array.Copyメソッド。Once you've determined the index or indexes at which the array should be split, you can then create the individual arrays by calling the Array.Copy method.

次の例では、配列がほぼ等しいサイズの 2 つの配列に分割します。The following example splits an array into two arrays of approximately equal size. (配列の要素の合計数が奇数の場合は、最初の配列が 2 番目の要素が 1 つです。)(If the total number of array elements is odd, the first array has one more element than the second.)


Module Example
   Public Sub Main()
      ' Create an array of 100 elements.
      Dim arr(99) As Integer
      ' Populate the array.
      Dim rnd As new Random()
      For ctr = 0 To arr.GetUpperBound(0)
         arr(ctr) = rnd.Next()
      Next
      
      ' Determine how many elements should be in each array.
      Dim divisor = 2
      Dim remainder As Integer
      Dim boundary = Math.DivRem(arr.GetLength(0), divisor, remainder)
            
      ' Copy the array.
      Dim arr1(boundary - 1 + remainder), arr2(boundary - 1) as Integer
      Array.Copy(arr, 0, arr1, 0, boundary + remainder)
      Array.Copy(arr, boundary + remainder, arr2, 0, arr.Length - boundary) 
   End Sub
End Module

次の例では、値は"zzz"配列の区切り記号として機能する要素の有無に基づいて 2 つの配列に文字列の配列を分割します。The following example splits a string array into two arrays based on the presence of an element whose value is "zzz", which serves as the array delimiter. 新しい配列には、区切り記号を含む要素を含めないでください。The new arrays do not include the element that contains the delimiter.


Module Example
   Public Sub Main()
      Dim rnd As New Random()
      
      ' Create an array of 100 elements.
      Dim arr(99) As String
      ' Populate each element with an arbitrary ASCII character.
      For ctr = 0 To arr.GetUpperBound(0)
         arr(ctr) = ChrW(Rnd.Next(&h21, &h7F))
      Next
      ' Get a random number that will represent the point to insert the delimiter.
      arr(rnd.Next(0, arr.GetUpperBound(0))) = "zzz"

      ' Find the delimiter.
      Dim location = Array.FindIndex(arr, Function(x) x = "zzz")

      ' Create the arrays.
      Dim arr1(location - 1) As String
      Dim arr2(arr.GetUpperBound(0) - location - 1) As String
      
      ' Populate the two arrays.
      Array.Copy(arr, 0, arr1, 0, location)
      Array.Copy(arr, location + 1, arr2, 0, arr.GetUpperBound(0) - location)
   End Sub
End Module

配列への参加Joining arrays

1 つの大きな配列に、さまざまな配列を組み合わせることもできます。You can also combine a number of arrays into a single larger array. これを行うには、使用することも、Array.Copyメソッド。To do this, you also use the Array.Copy method.

注意

このセクションでは、1 つの文字列に文字列の配列を結合するには説明しません。This section does not discuss joining a string array into a single string. 文字列の配列を結合する方法については、次を参照してください。、String.Joinメソッド。For information on joining a string array, see the String.Join method.

新しい配列に各配列の要素をコピーする前に、まず新しい配列を十分に格納されるよう、配列を初期化することを確認する必要があります。Before copying the elements of each array into the new array, you must first ensure that you have initialized the array so that it is large enough to accommodate the new array. 2 つの方法のいずれかでこれを行うことができます。You can do this in one of two ways:

  • 使用して、 ReDim Preserve ステートメントを動的に新しい要素を追加する前に、配列を展開します。Use the ReDim Preserve statement to dynamically expand the array before adding new elements to it. これは、最も簡単な方法では、大きな配列をコピーするときにパフォーマンスの低下と過剰なメモリ消費量で発生する可能性が。This is the easiest technique, but it can result in performance degradation and excessive memory consumption when you are copying large arrays.
  • 新しいの大きな配列の必要な要素の合計数を計算し、各ソース配列の要素を追加します。Calculate the total number of elements needed for the new large array, then add the elements of each source array to it.

次の例では、1 つの配列に 10 個の要素を持つ 4 つの配列を追加するのに 2 番目のアプローチを使用します。The following example uses the second approach to add four arrays with ten elements each to a single array.

Imports System.Collections.Generic
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim tasks As New List(Of Task(Of Integer()))
      ' Generate four arrays.
      For ctr = 0 To 3
         Dim value = ctr
         tasks.Add(Task.Run(Function()
                               Dim arr(9) As Integer
                               For ndx = 0 To arr.GetUpperBound(0)
                                  arr(ndx) = value
                               Next
                               Return arr
                            End Function))   
       Next
       Task.WaitAll(tasks.ToArray())
       ' Compute the number of elements in all arrays.
       Dim elements = 0
       For Each task In tasks
          elements += task.Result.Length
       Next
       Dim newArray(elements - 1) As Integer
       Dim index = 0
       For Each task In tasks
          Dim n = task.Result.Length
          Array.Copy(task.Result, 0, newArray, index, n)
          index += n
       Next 
      Console.WriteLine($"The new array has {newArray.Length} elements.")
   End Sub
End Module
' The example displays the following output:
'     The new array has 40 elements.

ソース配列が小さすべてここでは、ため各新しい配列の要素を追加、配列を展開も動的にします。Since in this case the source arrays are all small, we can also dynamically expand the array as we add the elements of each new array to it. 次の例でこれを確認できます。The following example does that.

Imports System.Collections.Generic
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim tasks As New List(Of Task(Of Integer()))
      ' Generate four arrays.
      For ctr = 0 To 3
         Dim value = ctr
         tasks.Add(Task.Run(Function()
                               Dim arr(9) As Integer
                               For ndx = 0 To arr.GetUpperBound(0)
                                  arr(ndx) = value
                               Next
                               Return arr
                            End Function))   
       Next
       Task.WaitAll(tasks.ToArray())

       ' Dimension the target array and copy each element of each source array to it.
       Dim newArray() As Integer = {}
       ' Define the next position to copy to in newArray.
       Dim index = 0
       For Each task In tasks
          Dim n = Task.Result.Length
          ReDim Preserve newArray(newArray.GetUpperBound(0) + n)
          Array.Copy(task.Result, 0, newArray, index, n)
          index += n
       Next 
      Console.WriteLine($"The new array has {newArray.Length} elements.")
   End Sub
End Module
' The example displays the following output:
'     The new array has 40 elements.

配列の代わりとしてのコレクションCollections as an alternative to arrays

配列は、数が固定されている厳密に型指定されたオブジェクトの作成および処理に最も適しています。Arrays are most useful for creating and working with a fixed number of strongly typed objects. コレクションは、オブジェクトのグループをより柔軟に処理できます。Collections provide a more flexible way to work with groups of objects. 使用して配列のサイズを明示的に変更することが必要する、配列とは異なり、 ReDimステートメントコレクションの拡大し、アプリケーションの変更のニーズに合わせて動的に縮小します。Unlike arrays, which require that you explicitly change the size of an array with the ReDim Statement, collections grow and shrink dynamically as the needs of an application change.

使用するとReDimVisual Basic 配列のディメンションを変更する新しい配列を作成および 1 つ前を解放します。When you use ReDim to redimension an array, Visual Basic creates a new array and releases the previous one. これには、実行時間がかかります。This takes execution time. そのため、頻繁に変更するかを使用している項目の数が必要な項目の最大数を予測できない場合は、通常取得されますパフォーマンスを向上させるコレクションを使用しています。Therefore, if the number of items you are working with changes frequently, or you cannot predict the maximum number of items you need, you'll usually obtain better performance by using a collection.

コレクションによっては、コレクションに含まれるオブジェクトのキーを割り当てると、そのキーを使用してオブジェクトを迅速に取り出すことができます。For some collections, you can assign a key to any object that you put into the collection so that you can quickly retrieve the object by using the key.

含まれる要素が 1 つのデータ型だけのコレクションの場合は、 System.Collections.Generic 名前空間のクラスのいずれかを使用できます。If your collection contains elements of only one data type, you can use one of the classes in the System.Collections.Generic namespace. ジェネリック コレクションでは、タイプ セーフが強制されるため、他のデータ型を追加することはできません。A generic collection enforces type safety so that no other data type can be added to it.

コレクションの詳細については、「コレクション」を参照してください。For more information about collections, see Collections.

用語Term 定義Definition
Array Dimensions in Visual BasicArray Dimensions in Visual Basic 配列のランクと次元について説明します。Explains rank and dimensions in arrays.
方法: Visual Basic で配列変数を初期化します。How to: Initialize an Array Variable in Visual Basic 配列に初期値を設定する方法について説明します。Describes how to populate arrays with initial values.
方法: Visual Basic で配列を並べ替えるHow to: Sort An Array in Visual Basic 配列の要素をアルファベット順に並べ替える方法について説明します。Shows how to sort the elements of an array alphabetically.
方法: 1 つの配列を別の配列に代入します。How to: Assign One Array to Another Array 配列を別の配列変数に代入するときの手順と規則を説明します。Describes the rules and steps for assigning an array to another array variable.
配列のトラブルシューティングTroubleshooting Arrays 配列を使用しているときに発生する一般的な問題について説明します。Discusses some common problems that arise when working with arrays.

関連項目See also