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.
Gracias por el enlace. Esto tomará una lectura cuidadosa. –
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. –