検索
VB.NETの動的配列の話です。(配列ではありませんので注意)
そもそも動的配列は、リストを持っていなかったVB(.NET以前)が苦肉の策で生み出した要素を増やすことのできる配列。だと思っています。
VBは.NETになり、リストを手にしました。しかも .NET Framework という強力なフレームワークが提供しているリストです。もはや動的配列を利用する必要はありません。
下に、動的配列とリストを使用した例を示します。
共に空の文字列をループしながら足していき、最終的にStringの配列を返しています。
(動的配列)
1| Private Function GetArrayByDynaArray() As String() 2| Dim array As String() = {} 3| 4| For i As Integer = 1 To 10000 5| ReDim Preserve array(array.Length) 6| array(array.Length - 1) = "" 7| Next 8| 9| Return array 10| End Function
(リスト)
1| Private Function GetArrayByArrayList() As String() 2| Dim list As ArrayList = New ArrayList 3| 4| For i As Integer = 1 To 10000 5| list.Add("") 6| Next 7| 8| Return CType(list.ToArray(GetType(String)), String()) 'String配列化 9| End Function
この処理に要した時間は次のとおりです。
| ループ回数 | 動的配列 | リスト |
|---|---|---|
| 1,000 | 0.7sec | 0.001sec以下 |
| 2,000 | 2.9sec | 0.001sec以下 |
| 3,000 | 12.5sec | 0.01sec |
処理時間には桁違い以上の差があります。しかも動的配列はループ(処理回数)が増えれば増えるほど遅くなる差が増しています。 なぜか?ここで詳しくは説明しませんが、ReDim Preserve で配列要素を1つ増やし、今ある要素のデータを全てコピーをするため、要素数が増えれば増えるほど処理が重くなっていきます。
動的配列はあくまでも配列なのでインデックスで要素にアクセスする程度しかありませんが、 ArrayListクラスは IList, ICollection, IEnumerable のインターフェースを実装しているので要素に対してあらゆる操作が可能です。 必要なときは上記ソースのように配列を取得できます。
ここまでくれば何も言うことはないかも知れませんが、動的配列を使うメリットは特にありません。
プログラムの統一性からもリスト一本に合わせた方が見通しもいいです。リストを使いましょう。