vb.net 2003 Arraylist структуры, которые имеют arraylist - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть две структуры

Публичная структура 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 As myResearchData MyResearchData.arraylistRData = New ArrayList Dim MyResearchSubData As myResearchSubData

У меня есть массив myResearchSubData, который является MyResearchData.arraylistRData, и я добавил его в MyResearchDataAList. Но когда я очистил MyResearchData.arraylistRData, массив данных в MyResearchDataAList также был очищен. Я думал, что как только он будет добавлен в MyResearchDataAList, он будет содержать массив, но он также будет очищен. Ниже описан процесс, который я проделал.

MyResearchSubData.recordingDate = Date.Parse (Date) MyResearchSubData.book = Book MyResearchSubData.page = Page MyResearchSubData.year = Год MyResearchSubData.fee = Fee

Поместить данные в структуру MyResearchSubData

MyResearchData.arraylistRData.Add (MyResearchSubData)

Добавлено в MyResearchData.arraylistRData

MyResearchDataAList.Add (MyResearchData)

Добавлено в MyResearchDataAList

MyResearchData.arraylistRData.Clear ()

Очистил MyResearchData.arraylistRData для новых данных, которые нужно вставить, но он также очищает массив в MyResearchDataAList и не удалял содержимое массива

Заранее спасибо тем, кто может помочь мне с этой проблемой

1 Ответ

0 голосов
/ 22 сентября 2011

Это происходит потому, что на самом деле к списку массивов добавляются те же элементы, что и по ссылке.Вы действительно хотите добавить копию каждого элемента в свой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...