2012-07-12 40 views
5

Si estoy acumulando datos sin información previa sobre la cantidad de elementos, puedo usar una matriz y ampliarla según sea necesario usando Redim Preserve, pero un List generalmente será más eficiente. Por ejemplo:¿Es posible actualizar elementos dentro de una lista (de estructura)?

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") 

A pesar de que mi suposición de 4 como el número máximo de elementos que estaba mal, puedo añadir nuevos elementos sin problemas.

puedo mostrar los elementos para:

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

y obtener:

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

puedo actualizar los elementos según sea necesario y volver a mostrar:

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

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

Para obtener:

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

puedo crear una lista de estructuras casi tan fácilmente:

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) 

muestra el contenido de la lista con:

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

da:

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

Si personDtl eran una matriz, lo podría actualizar un elemento fácilmente Para corregir la edad de Wendy, escribiría:

personDtl(3).age = 24 

Sin embargo, la misma declaración con una lista, da como resultado una línea azul bajo personDtl(3).age y el mensaje de error: "expresión es un valor y por lo tanto no puede ser objeto de . una misión "

La mejor solución que he encontrado es:

Dim personDtlCrnt As SpersonDtl 

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

En mi solicitud, yo estoy acumulando información en estructuras grandes y complejas. Para copiar un elemento fuera de la lista, agregar un nuevo elemento de información y luego copiarlo de nuevo no sería un proceso eficiente.

Agradecería cualquier sugerencia para un enfoque alternativo.

Respuesta

9

Intenta usar una clase en lugar de una estructura.

De Choosing Between Classes and Structures

considerar el diseño de una estructura en lugar de una clase si las instancias del tipo son pequeñas y por lo general de corta duración o son comúnmente incorporados en otros objetos.

no definen una estructura de menos que el tipo tiene todas las características siguientes:

  • Es lógicamente representa un único valor, similar a los tipos primitivos (entero, doble, y así sucesivamente).

  • Tiene un tamaño de instancia menor que 16 bytes.

  • Es inmutable.

  • No tendrá que estar en la caja con frecuencia.

Si una o más de estas condiciones no se cumplen, cree un tipo de referencia en lugar de una estructura. El incumplimiento de esta directriz puede afectar negativamente el rendimiento.

Desea que su "estructura" SpersonDtl se pueda cambiar cambiando uno de los valores, que está rompiendo una de las características enumeradas anteriormente.

+1

Gracias por el enlace. Esto tomará una lectura cuidadosa. –

+0

Puedo encontrar mucha ayuda para las listas y mucha ayuda para las clases, pero ninguna para las listas de clases. Sin embargo, he logrado que funcione mi pequeño caso de prueba. Tendré que dedicar más tiempo al estudio y la experimentación, pero obviamente este es el enfoque correcto. Gracias. –

Cuestiones relacionadas