Array nur einmal umkehren?

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ERSC.

    Array nur einmal umkehren?

    Hallo,
    Ich habe ein Array (Liste), dieses Array brauche ich einmal vorwärts (Liste1) und einmal rückwärts (Liste2).
    Wenn ich nun

    VB.NET-Quellcode

    1. Liste1 = Liste
    2. Array.Reverse(Liste)
    3. Liste2 = Liste

    mache, dann ist Liste1 und Liste2 umgekehrt... ich verstehe nicht ganz warum das so ist... Kann mir das jemand erklären? und gibt es da noch einen Trick?
    Das ist lustig und ganz normal^^
    Die Liste ist ja eine Klasse - und Klassen werden Referenziert. Das heißt Liste1 und Liste2 sind lediglich 'Zeiger' auf die exakt gleiche Liste. Es gibt als eine Liste und zwei Zeiger. Mit Array.Reverse veränderst du die Liste. Das ist den Zeigern aber egal.

    Stell dir Zeiger vor wie ein Stück Papier wo eine Adresse draufsteht. Davon kannst du 20 Stück mit "Laubstraße 4a" haben - wenn du sagst "Abrissbirne, reiße ein Haus ab, die Adresse steht auf Zettel 5" dann ist das Haus platt, auch wenn du zur Adresse von Zettel 12 gehst xD

    Lösen lässt sich das aber ganz einfach: Du muss die Liste kopieren - dafür gibt es mehrere Möglichkeiten:
    - einfach eine Schleife durmrumbauen und Element für Element in eine zweite (!) Liste schreiben
    - Serialisieren und wieder deserialisieren
    - .clone, allerdings ist die afaik oft tückisch
    - andere...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()

    Du arbeitest hier mit einem Referenztyp, wenn du also Liste1 = Liste schreibst, dann werden Änderungen, die du an Liste vornimmst auch in Liste1 übernommen und umgekehrt. Um das zu verhindern musst du das Array kopieren (z.B. mit Array.Copy).

    Edit: da war wieder jemand schneller.
    xD
    Wenn du die List(of T) verwendest kannst du die Liste mittels Konstruktor kopieren - habe das grade getestet, am besten mal lesen was auf msdn steht^^ So wäre das jedenfalls sehr einfach.

    VB.NET-Quellcode

    1. Dim Liste1 As New List(Of Integer)({1, 2, 3, 4, 5})
    2. Dim Liste2 As New List(Of Integer)(Liste1)
    3. Liste2.Reverse()
    4. MsgBox(Liste1.First.ToString & " " & Liste2.First.ToString)



    Aber vorsichtig: Auch die Werte in der List(of T) können Referenzen sein xD Structures werden nicht referenziert, Klassen schon. Eine List(of Integer) wird sich also anders verhalten als eine List(of Bitmap). Veränderst du eine Zahl 'merkt' die andere Liste nichts, weil es Wertetypen sind. Zeichnest du aber eine Linie auf eine Bitmap so ist auch die Bitmap der anderen Liste verändert (=> es ist ein und die selbe Bitmap weil Klassen-Referenz).
    :thumbsup: Danke an alle für die schnellen und ausführlichen Antworten... :thumbsup:

    ... mit List(of T) komme ich für das was ich vorhabe sehr gut zurecht...

    Nur noch der Vollständigkeit halber was ich vorhabe...
    Ich habe 2 Listen eine mit Bezeichnern und eine mit Werten... ich brauche manchmal Bezeichner vorwärts - Werte rückwärts oder Bezeichner rückwärts - Werte vorwärts oder beides in gleicher Richtung, je nach dem was wo ausgewählt wurde... Und da sich meine Grundlisten (manchmal auch "außer der Reihe") immer wieder ändern, muß ich "Vorwärts" und "Rückwärts" zwischenspeichern...

    Den Hinweis mit "Last-in-First-Out" kann ich an anderer Stelle sehr gut gebrauchen... ^^