2012-07-12 8 views
5

Se sto accumulando dati senza informazioni preventive sul numero di elementi, posso usare un array e ingrandirlo secondo necessità usando Redim Preserve, ma un List di solito sarà più efficiente. Per esempio:È possibile aggiornare gli elementi all'interno di un elenco (di struttura)?

Dim vehicle As New List(Of String)(4) 

vehicle.Add("car") 
vehicle.Add("bicycle") 
vehicle.Add("truck") 
vehicle.Add("taxi") 
vehicle.Add("motorbike") 
vehicle.Add("bus") 

Anche se la mia ipotesi di 4 come il numero massimo di elementi è stato sbagliato, posso aggiungere nuovi elementi senza problemi.

posso visualizzare gli elementi così:

For inx = 0 To vehicle.Count - 1 
    Debug.Print(" " & inx & " " & vehicle(inx)) 
Next 

e ricevere:

0 car 
1 bicycle 
2 truck 
3 taxi 
4 motorbike 
5 bus 

posso aggiornare elementi come richiesto e visualizzare nuovamente:

vehicle(2) = "coach" 
vehicle(4) = "cart" 

For inx = 0 To vehicle.Count - 1 
    Debug.Print(" " & inx & " " & vehicle(inx)) 
Next 

per ottenere:

0 car 
1 bicycle 
2 coach 
3 taxi 
4 cart 
5 bus 

posso creare una lista di strutture quasi con la stessa facilità:

Structure SpersonDtl 
    Dim familyName As String 
    Dim givenName As String 
    Dim age As Integer 
End Structure 

Dim personDtl As New List(Of SpersonDtl)(4) 
Dim personDtlCrnt As SpersonDtl 

personDtlCrnt.familyName = "Smith" 
personDtlCrnt.givenName = "John" 
personDtlCrnt.age = 20 
personDtl.Add(personDtlCrnt) 

personDtlCrnt.familyName = "Brown" 
personDtlCrnt.givenName = "Clare" 
personDtlCrnt.age = 21 
personDtl.Add(personDtlCrnt) 

personDtlCrnt.familyName = "Wilson" 
personDtlCrnt.givenName = "David" 
personDtlCrnt.age = 22 
personDtl.Add(personDtlCrnt) 

personDtlCrnt.familyName = "Fox" 
personDtlCrnt.givenName = "Wendy" 
personDtlCrnt.age = 23 
personDtl.Add(personDtlCrnt) 

visualizzazione del contenuto della lista con:

For inx = 0 To personDtl.Count - 1 
    Debug.Print(" " & inx & " " & personDtl(inx).givenName & " " & _ 
       personDtl(inx).familyName & " " & personDtl(inx).age) 
Next 

dà:

0 John Smith 20 
1 Clare Brown 21 
2 David Wilson 22 
3 Wendy Fox 23 

Se personDtl fosse un array, I potrebbe aggiornare facilmente un elemento. Per correggere l'età di Wendy, avrei scritto:

personDtl(3).age = 24 

Tuttavia, la stessa istruzione con una lista, si traduce in una linea blu sotto personDtl(3).age e il messaggio di errore: "espressione è un valore e quindi non può essere bersaglio di . La soluzione migliore di un incarico "

che ho trovato è:

Dim personDtlCrnt As SpersonDtl 

personDtlCrnt = personDtl(3) 
personDtlCrnt.age = 24 
personDtl(3) = personDtlCrnt 'Write back. 

Nella mia domanda, mi sto accumulando informazioni in grandi, strutture complesse. Per copiare un elemento fuori dalla lista, aggiungere una nuova informazione e poi copiarlo non sarebbe un processo efficiente.

Sarei grato per qualsiasi suggerimento per un approccio alternativo.

risposta

9

Provare a utilizzare una classe anziché una struttura.

Da Choosing Between Classes and Structures

Prendere in considerazione la definizione di una struttura invece di una classe se le istanze del tipo sono piccole e comunemente breve durata o sono comunemente incorporati in altri oggetti.

non definiscono una struttura meno che il tipo ha tutte le caratteristiche seguenti:

  • Esso rappresenta logicamente un singolo valore, simili ai tipi primitivi (integer, doppia, e così via).

  • Ha una dimensione dell'istanza inferiore a 16 byte.

  • È immutabile.

  • Non dovrà essere inserito frequentemente in una scatola.

Se una o più di queste condizioni non vengono soddisfatte, creare un tipo di riferimento anziché una struttura. La mancata osservanza di queste linee guida può influire negativamente sulle prestazioni.

Si desidera che la "struttura" di SpersonDtl sia modificabile modificando uno dei valori, che interrompe una di quelle caratteristiche elencate sopra.

+1

Grazie per il collegamento. Questo richiederà una lettura attenta. –

+0

Posso trovare un sacco di aiuto per le liste e un sacco di aiuto per le classi, ma nessuno per le liste di classi. Tuttavia, sono riuscito a far funzionare il mio piccolo test case. Avrò bisogno di dedicare più tempo allo studio e alla sperimentazione, ma questo è ovviamente l'approccio corretto. Grazie. –

Problemi correlati