2012-05-14 66 views

回答

8

使用ReDim with Preserve可以在保留舊值的情況下增加數組的大小。

如果您不知道大小,並逐漸知道增加數組大小,則建議您使用ReDim循環。

Dim TeamIndex(), i As Integer 

For i = 0 to 100 
    ReDim Preserve TeamIndex(i) 
    TeamIndex(i) = <some value> 
Next 

如果你在拍攝代碼在稍後的聲明數組的大小,然後使用

ReDim TeamIndex(100) 

因此,代碼將是:

Dim TeamIndex(), i As Integer 
ReDim TeamIndex(100) 
For i = 0 to 100 
    TeamIndex(i) = <some value> 
Next 

您可以使用ArrayList中/名單(Of T)使用更動態添加/刪除值。

Sub Main() 
    ' Create an ArrayList and add three strings to it. 
    Dim list As New ArrayList 
    list.Add("Dot") 
    list.Add("Net") 
    list.Add("Perls") 
    ' Remove a string. 
    list.RemoveAt(1) 
    ' Insert a string. 
    list.Insert(0, "Carrot") 
    ' Remove a range. 
    list.RemoveRange(0, 2) 
    ' Display. 
    Dim str As String 
    For Each str In list 
     Console.WriteLine(str) 
    Next 
    End Sub 

List(Of T) MSDN

List(Of T) DotNetperls

+0

無需ReDim和Preserve。只要初始化大小爲100的數組[假設大小爲100] – Writwick

+0

'對於i = 0到SomeNo'。因此,如果數組將被初始化在這種情況下[由於新的整數(SomeNo)','ReDim'和'Preserve'將不需要[由asker舉例],因爲'SomeNo'是不變的。因此,如果'SomeNo'也是可變的並且不斷變化,那麼'ReDim'和'Preserve'將是必要的! – Writwick

+1

+1,但List(Of T)應優於ArrayList的新代碼 – MarkJ

2

中沒有任何Romil的答案,我認爲是錯誤的,但我會走的更遠。 ReDim Preserve是一個非常有用的命令,但認識到這是一個昂貴的命令並明智地使用它是很重要的。

考慮:

Dim TeamIndex(), i As Integer 
For i = 0 to 100 
    ReDim Preserve TeamIndex(i) 
    TeamIndex(i) = <some value> 
Next 

對於每一個循環中,除了I = 0時,公共語言運行時(CLR)必須:

  • 新整數數組,它是一個元件比大的查找空間前一個數組
  • 複製前一個數組中的值
  • 初始化新元素
  • 釋放之前的垃圾收集數組。

ArrayList如果您需要添加或刪除陣列中間的元素,但即使您不需要該功能,您仍然支付該功能,那就太棒了。例如,如果您正在讀取文件中的值並按順序存儲它們,但事先並不知道有多少值,那麼ArrayList會帶來大量可以避免的開銷。

我總是用ReDim這樣的:

Dim MyArray() As XXX 
Dim InxMACrntMax As Integer 

ReDim MyArray(1000) 
InxMACrntMax=-1 

Do While more data to add to MyArray 

    InxMACrntMax = InxMACrntMax + 1 
    If InxMACrntMax > UBound(MyArray) Then 
    ReDim Preserve MyArray(UBound(MyArray)+100) 
    End If 
    MyArray(InxMACrntMax) = NewValue 

Loop     

ReDim MyArray(InxMACrntMax) ' Discard excess elements 

上面我已經在我的要求很可能評估中使用100和1000我挑中的值取決於。