vb.net 2003结构的Arraylist有一个arraylist

时间:2011-09-22 11:10:01

标签: vb.net struct arraylist

我有两个结构

  

公共结构myResearchData

    Public batchName As String
    Public arraylistRData As ArrayList
End Structure

Public Structure myResearchSubData
    Public researchDescription As String
    Public recordingDate As Date
    Public book As String
    Public page As String
    Public year As String
    Public fee As String
End Structure

我在子

中初始化它们
  

Dim MyResearchDataAList As New ArrayList     Dim MyResearchData作为myResearchData     MyResearchData.arraylistRData = New ArrayList     Dim MyResearchSubData as myResearchSubData

我有一个myResearchSubData的arraylist,它是MyResearchData.arraylistRData并将其添加到MyResearchDataAList中。但是当我清除了MyResearchData.arraylistRData时,MyResearchDataAList中的arraylist也被清除了。我认为一旦它被添加到MyResearchDataAList它将保持arraylist但它也是clered。以下是我所做的过程。

  

MyResearchSubData.recordingDate = Date.Parse(Date)                           MyResearchSubData.book = Book                           MyResearchSubData.page = Page                           MyResearchSubData.year =年份                           MyResearchSubData.fee =费用

将数据放入MyResearchSubData

的结构中
  

MyResearchData.arraylistRData.Add(MyResearchSubData)

在MyResearchData.arraylistRData

中添加了它
  

MyResearchDataAList.Add(MyResearchData)

在MyResearchDataAList

中添加了它
  

MyResearchData.arraylistRData.Clear()

清除了要放入的新数据的MyResearchData.arraylistRData,但它也清除了MyResearchDataAList中的arraylist,并且没有使用arraylist的内容

提前感谢那些可以帮助我解决这个问题的人

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为它实际上是添加到数组列表中的相同项目,因为它们是通过引用添加的。您希望实际将每个项目的COPY添加到arrayList。

我一般认为最简单的方法就是在循环中添加对象的克隆。

要做到这一点,您可能需要实现ICloneable才能获得正确的副本。但是,在myResearchSubData的级别上,您可以使用memberwiseClone方法。

如果您将类更改为类而不是结构,则可以像这样使用克隆:

   Public Class myResearchSubData
        Implements ICloneable

        Public researchDescription As String
        Public recordingDate As Date
        Public book As String
        Public page As String
        Public year As String
        Public fee As String

        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return Me.MemberwiseClone
        End Function
    End Class

然后,您需要遍历myResearchSubData的原始列表,并将其克隆添加到第二个列表中。类似的东西:

For Each item as myResearchSubData in MyResearchData.arraylistRData
   MyResearchDataAList.Add(CType(item.Clone, myResearchSubData))
Next

如果你想继续使用这些结构,那么我将使用相同的循环类型,并创建一个创建新的myResearchSubData的函数,并将原始数据复制到新的。

  For Each item as myResearchSubData in MyResearchData.arraylistRData
       MyResearchDataAList.Add(CloneStructure(item))
    Next