VB6 には、Redim
構文・Redim Preserve
構文というのがあります。配列の宣言や、配列のサイズ変更を行なう構文です。
動的配列(実行時にサイズが変わる配列)を扱うことは、よくありますよね。.NET Frameworkで開発しているなら、Redim
構文・Redim Preserve
構文は使わないで下さい! 配列のサイズ変更を Redim Preserve
が多発する VB.NET のソースを見ると、もうホント逃げ出したくなります。まさに VB6 の亡霊。。。
代わりに、Generic.List
を使いましょう。
ジェネリックって?
「ジェネリック」とは、型をテンプレート(パラメータ)として定義したクラスや関数のことです。使用時に型を指定します。Visual Basic 2005 で導入されました。
Redim Preserve構文 と Generic.List の比較
宣言
Dim array() As Item
Dim list As Generic.List(Of Item)
末尾に要素を追加
Redim Preserve array(Ubound(array) + 1)
array(Ubound(array)) = item
list.Add(item)
インデックス n に要素を追加
Redim Preserve array(Ubound(array) + 1)
For i = Ubound(array) To n + 1 Step -1
array(i) = array(i - 1)
Next
array(n) = item
list.Insert(n, item)
インデックス n の要素を削除
For i = n To Ubound(array) - 1
array(i) = array(i + 1)
Next
Redim Preserve array(Ubound(array) - 1)
list.RemoveAt(n)
要素数を取得
Ubound(array) + 1
list.Count
クリア(空にする。要素を全削除)
Redim array(-1)
list.Clear()
Generic.List
にしかできないこと
フィルタリング
For Each item In items.Where(Function(_item) _item IsNot Nothing)
Debug.Print(_item.Name)
Next
関数の適用
Dim l As New Generic.List(Of Integer)({1, 2, 3, 4, 5})
l.ForEach(Sub(n) Debug.Print(n * n))
Dim l As New Generic.List(Of Integer)({1, 2, 3, 4, 5})
Dim sum = l.Select(Function(n) n * n).Sum()
配列と Generic.List
の変換
配列からGeneric.List
を作るには、array.ToList()
を使います。
Generic.List
から配列を作るには、list.ToArray()
を使います。
まとめ
添字をいつも頭のなかで計算しないといけないコードはスマートとはいえません!
VisualBasic で開発するなら、Redim
、Redim Preserve
、UBound
は捨てて、Generic.List
を使いましょう。