vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.

Hinweis:
Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden!

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen zu Tipps & Tricks und Workshops im vb@rchiv
Tipp 2381: Kopieren eines multidimensionalen Arrays 
Autor: Manfred X
 Tipp anzeigenDatum: 03.10.13 06:31

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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Tipp 2381: Kopieren eines multidimensionalen Arrays3.248Manfred X03.10.13 06:31
Berichtigung1.302Manfred X09.11.13 16:04

Sie sind nicht angemeldet!
Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel