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

您声明一个指向二维数组的指针,而不对其元素执行任何内存分配。预计某些方法将返回此数组,您将通过此指针使用它。如果您尝试按原样使用它,而不给它分配任何东西,您将得到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 回答