今回は、VB.NETでList(配列)を2次元配列のように使用する方法についてご紹介します。
Listを使って2次元配列を扱うメリット
VB.NETでは、多次元配列を宣言して固定サイズの行列を扱う方法があります。
一方で、Listを用いることで、サイズの変更や行ごとの要素数が異なる構造(ジャグ配列)を柔軟に扱えるメリットがあります。
2次元配列をListで扱う代表的な方法には、List(Of List(Of T))を用いる方法と、単一のListで2次元をシミュレートする方法があります。
以下でそれぞれの実装例をご紹介します。
List(Of List(Of T))を使った2次元配列の実装
List(Of List(Of T))を用いると、行ごとに内側のListを持つ構造が作れます。
サイズが動的に変化するため、行や列の追加・削除が容易です。
また、行ごとに要素数が異なるジャグ配列としても利用できます。
以下は3行×4列のデータを格納する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
' 行数と列数を定義 Dim rowCount As Integer = 3 Dim colCount As Integer = 4 ' 2次元リスト(List of List)の作成と初期化 Dim matrix As New List(Of List(Of Integer))() For i As Integer = 0 To rowCount - 1 Dim row As New List(Of Integer)() For j As Integer = 0 To colCount - 1 row.Add(0) ' 初期値として0を追加 Next matrix.Add(row) Next ' 例: 2行目の3列目に値を代入(行は0開始なので実際はmatrix(1)(2)) matrix(1)(2) = 42 ' 値の取得例 Dim value As Integer = matrix(1)(2) Console.WriteLine("matrix(1)(2) = " & value) |
matrix(1)(2) = 42
このように、外側のListで「行」を管理し、内側のListで「列」を管理します。
行サイズや列サイズを柔軟に変更したい場合に有効です。
単一のListを使った2次元配列のシミュレート
もう1つの方法は、1次元のListに対してインデックスを計算することで2次元的に扱う方法です。
行数と列数が固定、またはほぼ固定の場合に利用しやすい実装です。
以下は3行×4列のデータを用意し、行 × 列数 + 列でインデックスを計算する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
' 行数と列数を定義 Dim rowCount As Integer = 3 Dim colCount As Integer = 4 ' 1次元Listを作成(初期容量は行数×列数) Dim list As New List(Of Integer)(rowCount * colCount) ' 全要素を0で初期化 For i As Integer = 0 To rowCount * colCount - 1 list.Add(0) Next ' 2次元のインデックスを1次元Listのインデックスに変換する関数 Dim GetIndex = Function(row As Integer, col As Integer) As Integer Return row * colCount + col End Function ' 例: 2行目(row=1)、3列目(col=2)に値を代入 list(GetIndex(1, 2)) = 99 ' 値の取得例 Dim retrievedValue As Integer = list(GetIndex(1, 2)) Console.WriteLine("list(" & 1 & ", " & 2 & ") = " & retrievedValue) |
list(1, 2) = 99
物理的には1次元のメモリ領域を確保するため、連続アクセスが可能です。
ただし、行列数の変更やジャグ配列の実現は容易ではないため、用途によって使い分けることをおすすめします。
Listを2次元配列として扱う際の注意点
ここでは、List(Of List(Of T))と単一のListを2次元的に扱う場合の注意点をまとめます。
- 境界チェック: 動的なListでもインデックス範囲外アクセスはエラーになります。
- 初期化のタイミング: List(Of List(Of T))では、内側のListを忘れずに初期化する必要があります。
- サイズの不揃い: ジャグ配列として使用する場合、各行のサイズが異なると処理時に注意が必要です。
- パフォーマンス: 大量データを扱う際は、要件に合った実装かどうかを事前に検討しましょう。
まとめ
VB.NETでは、List(Of List(Of T))と単一のListによって柔軟な2次元配列のような構造を実現できます。
行や列の動的な追加・削除を重視するならList(Of List(Of T))、固定的な行列アクセスを重視するなら単一Listがおすすめです。
用途や要件に合わせて最適なアプローチを選択すると、保守性や可読性が向上します。