我正在尝试创建城市距离数组CityDistances(CityId1, CityId2) = Distance
因为我不知道会有多少个城市,所以我需要一个无限数组。我尝试通过创建它Dim CityDistances(,) As Double
,但是当我尝试使用它时,它会引发异常。我该如何做到这一点?
问问题
6230 次
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
您声明一个指向二维数组的指针,而不对其元素执行任何内存分配。预计某些方法将返回此数组,您将通过此指针使用它。如果您尝试按原样使用它,而不给它分配任何东西,您将得到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 都会创建另一个数组并将所有元素复制到那里。随着阵列大小的增长,它可能成为性能因素。
第三,根据您问题的性质,您可能需要研究Matrix
该类的自定义实现。以下是我通过 Google 找到的一些链接,希望对您有用。这些是 C#,但互联网上有免费的 VB.NET 在线转换器。
C# 中的轻量级快速矩阵类(Strassen 算法,LU 分解)(免费)
C# 中的高效矩阵编程(代码项目,同样免费)
用于 .NET 编程的高性能矩阵代数!(付费,99 美元及以上)
于 2012-10-27T18:06:17.397 回答