2012-10-27 48 views
0

我想創建城市距離數組CityDistances(CityId1, CityId2) = Distance 因爲我不知道會有多少城市,所以我需要一個無限數組。我試圖通過Dim CityDistances(,) As Double創建它,但是當我嘗試使用它時,它會引發異常。我如何實現這一目標?創建無限大小的二維數組?

回答

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 

這樣做的好處是讓您的列表增長而不指定任何初始限制。

+0

查詢時間呢?爲了加快速度,您需要創建雙鍵索引(city1,city2)或解決此問題的方法。所以如果你想用OO​​P的方法,可能會更好的是有Dictionary Of Dictionaries。 – Neolisk

+0

確實如此,但我們不知道查找的OP要求。 – Steve

+1

我想你是對的。我們等待來自OP的任何評論。 :) – Neolisk

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及以上)