0

都市距離配列を作成しようとしています。都市CityDistances(CityId1, CityId2) = Distance がいくつあるかわからないので、無制限の配列が必要です。を介して作成しようとしましたDim CityDistances(,) As Doubleが、使用しようとすると例外がスローされます。どうすればそれを達成できますか?

4

2 に答える 2

3

配列の代わりに、おそらくより良い代替手段(そしてもう少し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

これには、初期制限を指定せずにリストを拡大できるという利点があります。

于 2012-10-27T18:18:13.770 に答える
1

まず第一に、これを行うことによって:

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ドル以上)

于 2012-10-27T18:06:17.397 に答える