Hallo!
Für die Erstellung der "flachen Kopie" eines beliebig dimensionierten Arrays
steht im Framework die Clone-Methode zur Verfügung.
Diese Methode ist ein O(n)-Vorgang, wobei n = Array.Length (Zahl der Elemente) ist.
'vierdimensionales Testarray
Dim xyz(1, 2, 3, 4) As String
xyz(0, 1, 2, 3) = "0123"
'typsicheres Klonen des Array
Dim abc As String(,,,) = CType(xyz.Clone, String(,,,)) "Flache Kopie": Bei Arrays, deren Elemente Referenztypen sind, wird jeweils
nur eine Referenz (=Verweis) für die einzelnen Array-Elemente weitergegeben,
bei Werttypen (und bei Strings) werden die Array-Elemente kopiert.
Ist bereits ein Zielarray geeignet dimensioniert,
kann eine Überladung der Copy-Methode (Shared) des Array-Objekts verwendet werden,
um Elemente (bzw. Teilbereiche von Elementen) zwischen zwei Arrays zu kopieren.
Dim abc2(1, 2, 3, 4) As String
Array.Copy(xyz, abc2, xyz.Length) .
.
.
Eine "tiefe Kopie" kann bei Arrays, deren Elemente die ICloneable-Schnittstelle
implementieren, typsicher durch eine generische Funktion realisiert werden.
Im Beispiel: eine Funktion für 2-dimensionale Arrays mit beliebigen Unter-
und Obergrenzen der beiden Array-Dimensionen
Public Function DeepCopyArr(Of T As ICloneable)(ByVal arr(,) As T) As T(,)
If arr Is Nothing Then Return Nothing
If arr.Length = 0 Then Return Nothing
Dim tp As System.Type = GetType(T)
Dim lengths(1) As Integer
lengths(0) = (arr.GetUpperBound(0) - arr.GetLowerBound(0)) + 1
lengths(1) = (arr.GetUpperBound(1) - arr.GetLowerBound(1)) + 1
Dim lowerbounds(1) As Integer
lowerbounds(0) = arr.GetLowerBound(0)
lowerbounds(1) = arr.GetLowerBound(1)
Dim carr As T(,) = _
CType(Array.CreateInstance(tp, lengths, lowerbounds), T(,))
For i As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
For k As Integer = arr.GetLowerBound(0) To arr.GetUpperBound(0)
If arr(i, k) IsNot Nothing Then
carr(i, k) = CType(arr(i, k).Clone, T)
Else
carr(i, k) = Nothing
End If
Next k
Next i
Return carr
End Function |