创建无限大小的二维数组?

时间:2012-10-27 17:45:55

标签: vb.net multidimensional-array

我正在尝试创建城市距离数组CityDistances(CityId1, CityId2) = Distance 由于我不知道会有多少个城市,我需要一个无限的阵列。我尝试通过Dim CityDistances(,) As Double创建它,但是当我尝试使用它时,它会引发异常。我如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

通过使用List(Of Type),而不是数组,可能更好的替代方案(以及更多的OOP)。

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

这样做的好处是可以让您的列表增长而不指定任何初始限制。

答案 1 :(得分: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#,但互联网上有free online converters to VB.NET

Lightweight fast matrix class in C# (Strassen algorithm, LU decomposition)(免费)

Efficient Matrix Programming in C#(代码项目,也是免费的)

High performance matrix algebra for .NET programming!(付费,99美元以上)