TotalTech

フリーランスのプログラマーが、技術情報・ガジェット・仕事術について書いてゆきます。資料価値の高い記事を目指しています。コーヒー好きです。

TotalTech

【VB.NET】Redim・Redim Preserve・UBoundは古い!Generic.Listを使おう

Redimは古すぎる・・・

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 で開発するなら、RedimRedim PreserveUBound は捨てて、Generic.Listを使いましょう。