2016-05-07 6 views
1
Dim i = 2 
    Do While True 
     i += 1 
     If IsDBNull(TmDataSet.T.Rows(0)(i)) = True Then Exit Do 
     Dim new_t As New train 
     new_t.id = TmDataSet.T.Rows(0)(i) 
     Dim j = 0 
     Do Until IsDBNull(TmDataSet.T.Rows(j + 1)(i)) 
      j += 1 
      Do Until (TmDataSet.T.Rows(j)(i) <> -1) 
       j += 1 
      Loop 
      If IsDBNull(TmDataSet.T.Rows(j + 1)(i)) Then Exit Do 
      Dim new_st As New station 
      new_st.t = TmDataSet.T.Rows(j)(i) 
      new_st.name = TmDataSet.T.Rows(j)(1) 
      new_st.id = TmDataSet.T.Rows(j)(2) 
      new_st.id_t = new_st.id.ToString & new_st.t 
      Dim new_st2 As New station 
      Do Until (TmDataSet.T.Rows(j + 1)(i) <> -1) 
       j += 1 
      Loop 
      new_st2.t = TmDataSet.T.Rows(j + 1)(i) 
      new_st2.name = TmDataSet.T.Rows(j + 1)(1) 
      new_st2.id = TmDataSet.T.Rows(j + 1)(2) 
      new_st2.id_t = new_st2.id.ToString & new_st2.t 

      Dim list As New List(Of station) 
      list.Add(new_st) 
      list.Add(new_st2) 
      new_t.st.Add(list) 
     Loop 
     per_network.Add(new_t) 
    Loop 

'network = tiefere Kopie von per_networkwie eine tiefe Kopie meiner Liste machen

vb >>> Ich will nur den Inhalt von per_network zu Netzwerk kopieren, ich habe Methode versucht ToList aber es war shallow copy und nicht Clone-Methode ausführen Ich habe es überhaupt nicht

+0

By the way, ich don Ich weiß nicht, ob du es gesehen hast, aber ich habe deine andere Frage beantwortet. Und ich entschuldige mich für das lange Warten. –

+0

@VisualVincent tiefer Dank für dich und deine Mühe, ich kann kein Wort finden, um es dir zu sagen Ich werde es jetzt überprüfen und wirklich schätze ich es – AlKobtan

Antwort

3

Sie können eine Erweiterungsmethode erstellen, in dem Sie das Objekt nur serialisiert es deserialisieren wieder . Dies erzeugt ein neues Objekt mit eigenen Referenzen, also eine Deep Copy.

Public Module Extensions 
    <System.Runtime.CompilerServices.Extension()> _ 
    Public Function DeepCopy(Of T)(ByVal Obj As T) As T 
     If Obj.GetType().IsSerializable = False Then Return Nothing 

     Using MStream As New MemoryStream 
      Dim Formatter As New BinaryFormatter 
      Formatter.Serialize(MStream, Obj) 
      MStream.Position = 0 
      Return DirectCast(Formatter.Deserialize(MStream), T) 
     End Using 
    End Function 
End Module 

Jetzt können Sie einfach anrufen:

Dim network As List(Of train) = per_network.DeepCopy() 

EDIT:

Dies sind die notwendigen Importe für meinen Code oben:

Imports System.IO 
Imports System.Runtime.Serialization.Formatters.Binary 
+0

Keine Option, die ich in Betracht gezogen hätte. – jmcilhinney

+0

@jmcilhinney: Ihre ist auch sehr gut und verbraucht wahrscheinlich weniger Speicher. Der einzige andere Unterschied besteht darin, dass meins eine tiefe Kopie eines beliebigen Typs ausführen kann. :) –

+0

@VisualVincent Fehler Typ 'WindowsApplication1.train' in Assembly 'TDSP, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null' ist nicht als serialisierbar markiert. – AlKobtan

1

Die einfachste Option ist mit LINQ, z

Dim newList = oldList.Select(Function(item) CreateCopyOfItem(item)).ToList() 

Wie die CreateCopyOfItem implementiert wird, hängt von der Art des Artikels. Wenn der Typ eine Copy oder Clone Methode oder einen Kopierkonstruktor hat, dann würden Sie das verwenden, andernfalls erstellen Sie einfach eine neue Instanz des Typs und kopieren die entsprechenden Daten z.

Private Function CreateCopyOfItem(item As SomeType) As SomeType 
    Return New SomeType With {.SomeProperty = item.SomeProperty} 
End Function 

Offensichtlich Sie eigentlich keine separate Funktion benötigen und können sie alle zusammen rollen, wenn Sie wollen:

Dim newList = oldList.Select(Function(item) New SomeType With {.SomeProperty = item.SomeProperty}).ToList() 
+0

Das ist keine tiefe Kopie, wenn 'SomeProperty' ein Referenztyp ist. – Crowcoder

+1

@Crowcoder, ja ist es. Eine tiefe Kopie ist alles, was keine flache Kopie ist. Eine tiefe Kopie könnte eine Ebene tief oder zwei oder so viele gehen, wie Sie möchten, aber wenn es erforderlich wäre, dass Sie auch die Eigenschaften eines Referenztyps eines Objekts kopieren würden, müssten Sie auch alle Referenztypeigenschaften dieser Eigenschaften und alle kopieren Referenztyp Eigenschaften dieser Eigenschaften von Eigenschaften und so weiter. Das könnte zu einem lächerlich großen Objekt-Graphen führen, der möglicherweise an mehreren Stellen auf sich selbst zurückkreist. – jmcilhinney

+0

Wie wäre das Objektdiagramm größer als das kopierte Objekt? Wie würde es sich auf sich selbst zurückziehen? Ist es besser, das kopierte Objekt fälschlicherweise zu verändern, wenn Sie die Kopie ändern, weil Sie die Konsequenzen nicht erkennen? Visual Vincents Antwort ist eine echte, tiefe Kopie. – Crowcoder

Verwandte Themen