2012-05-14 6 views

risposta

8

Utilizzare ReDim con Preserve per aumentare la dimensione della matrice mantenendo i vecchi valori.

ReDim in loop è consigliabile quando non si ha idea delle dimensioni e si è venuto a sapere per aumentare le dimensioni della matrice una alla volta.

Dim TeamIndex(), i As Integer 

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

Se di dichiarare la dimensione della matrice in avanti nel codice colpo quindi utilizzare

ReDim TeamIndex(100) 

Così il codice sarà:

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

È possibile utilizzare l'ArrayList/Lista (Di T) per utilizzare Aggiungi/Rimuovi i valori in modo più dinamico.

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

Nessuna necessità di ReDim e Mantieni. Basta inizializzare la matrice con la dimensione 100 [supponendo che la dimensione sia 100] – Writwick

+0

'Per i = 0 su SomeNo'. Quindi se l'array sarà inizializzato 'As New Integer (SomeNo)', 'ReDim' e' Preserve' non saranno necessari in questo caso [Esempio di asker] come 'SomeNo' è costante. Di conseguenza, se 'SomeNo' è anche variabile e costantemente modificato, allora' ReDim' e 'Preserve' saranno necessari! – Writwick

+1

+1 ma List (Of T) deve essere preferito su ArrayList per il nuovo codice – MarkJ

2

Non c'è nulla in risposta di Romil che ritengo di essere sbagliato, ma vorrei andare oltre. ReDim Preserve è un comando molto utile ma è importante rendersi conto che è un comando costoso e usarlo saggiamente.

considerare:

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

Per ogni ciclo, tranne i = 0, il Common Language Runtime (CLR), deve:

  • trovano spazio per un nuovo array intero che è uno degli elementi più grande di la matrice precedente
  • copiare i valori di fronte alla matrice precedente
  • inizializzare il nuovo elemento
  • rilascia l'array precedente per la garbage collection.

ArrayList è fantastico se avete bisogno di aggiungere o rimuovere elementi dalla metà della matrice, ma si sta pagando per tale funzionalità, anche se non ne hai bisogno. Se, ad esempio, stai leggendo i valori da un file e li memorizzi in modo sequenziale ma non sai in anticipo quanti valori ci saranno, lo ArrayList comporta un sovraccarico che puoi evitare.

Io uso sempre ReDim così:

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 

Sopra ho usato 100 e 1000. I valori io scelgo dipendono mia valutazione del requisito probabile.

Problemi correlati