都市距離配列を作成しようとしています。都市CityDistances(CityId1, CityId2) = Distance
がいくつあるかわからないので、無制限の配列が必要です。を介して作成しようとしましたDim CityDistances(,) As Double
が、使用しようとすると例外がスローされます。どうすればそれを達成できますか?
2 に答える
配列の代わりに、おそらくより良い代替手段(そしてもう少しOOP)は、を使用することList(Of Type)
です。
Dim d As List(Of DIstances) = New List(Of Distances)()
d.Add(New Distances() With {.CityID1=1, .CityID2=2, .Distance=12.4})
d.Add(New Distances() With {.CityID1=1, .CityID2=3, .Distance=15.1})
d.Add(New Distances() With {.CityID1=1, .CityID2=4, .Distance=2.4})
d.Add(New Distances() With {.CityID1=1, .CityID2=5, .Distance=130.1})
Public Class Distances
Public CityID1 as Integer
Public CityID2 as Integer
Public Distance as Double
End Class
これには、初期制限を指定せずにリストを拡大できるという利点があります。
まず第一に、これを行うことによって:
Dim CityDistances(,) As Double
要素のメモリ割り当てを実行せずに、2次元配列へのポインタを宣言します。いくつかのメソッドがこの配列を返すことが期待されており、このポインターを介してそれを使用します。何も割り当てずにそのまま使用しようとすると、index-out-of-bounds
例外が発生しますが、これは正常です。
第二に、無制限の配列のようなものはありません。DataTable
自動メモリ管理が必要な場合は、リストのリスト、辞書の辞書などを使用する必要があります。パフォーマンス/利便性の理由から、配列を使い続けたい場合はReDim
、必要に応じて(寸法を大きくして)、次のようにコンテンツを保持できます。
Dim CityDistances(,) As Double
ReDim Preserve CityDistances(10,10)
'.... code goes here ....
ReDim Preserve CityDistances(100,100)
ReDimを実行するたびに、.NETは別の配列を作成し、そこにすべての要素をコピーするため、いつReDimを実行するかを確認してください。アレイのサイズが大きくなると、パフォーマンスの要因になる可能性があります。
Matrix
第三に、質問の性質に基づいて、クラスのカスタム実装を調べたい場合があります。これが私がグーグルを通して見つけたいくつかのリンクです、あなたがそれらが役に立つと思うことを願っています。これらはC#ですが、インターネット上にVB.NETへの無料のオンラインコンバーターがあります。
C#の軽量高速行列クラス(Strassenアルゴリズム、LU分解)(無料)
C#での効率的なマトリックスプログラミング(コードプロジェクト、無料)
.NETプログラミング用の高性能行列代数!(有料、99ドル以上)