是否可以更新List(Of Structure)中的元素?

时间:2012-07-12 22:39:41

标签: vb.net

如果我在没有关于元素数量的预先信息的情况下积累数据,我可以使用数组并根据需要使用Redim Preserve进行放大,但List通常会更有效率。例如:

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

即使我猜测4作为最大元素数是错误的,我也可以毫无问题地添加新元素。

我可以显示元素:

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

并获得:

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

我可以根据需要更新元素并重新显示:

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

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

得到:

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

我几乎可以轻松地创建结构列表:

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)

显示列表的内容:

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

给出:

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

如果personDtl是一个数组,我可以轻松更新一个元素。为了纠正Wendy的年龄,我会写:

personDtl(3).age = 24

但是,与列表相同的语句会导致personDtl(3).age下的蓝线和错误消息:“ Expression是一个值,因此不能作为赋值的目标。

我找到的最佳解决方案是:

Dim personDtlCrnt As SpersonDtl

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

在我的应用程序中,我正在将信息累积到大型复杂结构中。要从列表中复制元素,添加一个新的信息项,然后将其复制回来将不是一个有效的过程。

对于替代方法的任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:9)

尝试使用类而不是结构。

来自Choosing Between Classes and Structures

  

如果类型的实例很小并且通常是短暂的或者通常嵌入在其他对象中,请考虑定义结构而不是类。

     

不要定义结构,除非该类型具有以下所有特征:

     
      
  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。

  •   
  • 它的实例大小小于16个字节。

  •   
  • 这是不可改变的。

  •   
  • 不必频繁装箱。

  •   
     

如果不满足这些条件中的一个或多个,请创建引用类型而不是结构。不遵守本指南可能会对绩效产生负面影响。

您希望您的SpersonDtl“结构”通过更改其中一个值而变得可变,这会破坏上面列出的其中一个特征。