Array verarbeiten

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    Array verarbeiten

    Hi,

    kleine Frage,
    Folgendes:

    VB.NET-Quellcode

    1. Dim Eins As String
    2. Dim Zwei As String
    3. Dim Drei As String
    4. '...SQL Datenbank befüllt die Werte
    5. 'Eins = "Irgendwas{95}UndSo"
    6. 'Zwei= "Irgendwas{95}UndSo"
    7. 'Drei= "Irgendwas{95}UndSo"
    8. Dim sArray As String() = {Eins,Zwei,Drei}
    9. For i = 0 to 10
    10. sArray(0) = sArray(0).ToString.Replace("{95}", "_")
    11. sArray(1) = sArray(1).ToString.Replace("{95}", "_")
    12. sArray(2) = sArray(2).ToString.Replace("{95}", "_")
    13. Next



    Jetzt meine Frage:

    werden meine Variablen Eins,Zwei,Drei nun ersetzt?
    ...?^^
    Wieso ich das jetzt nicht selbst teste? Bin leider bis heute Abend unterwegs... Würde das gerne schon wissen.
    Option Strict On!
    Frage 1 -> Wo ist das Ende deines For
    Frage 2 -> Wozu for wenn du dich danach eh hardcoded durch deinen Array bewegst

    VB.NET-Quellcode

    1. sArray(0) = sArray(0).ToString.Replace("{95}", "_")
    2. sArray(1) = sArray(1).ToString.Replace("{95}", "_")
    3. sArray(2) = sArray(2).ToString.Replace("{95}", "_")

    Frage 3 -> Wieso überhaupt ein for und kein For Each
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^

    VB.NET-Quellcode

    1. For Each str in sArray
    2. str=str.Replace("{95}", "_")
    3. Next


    Warum "ToString", wenn es schon Strings sind?

    Ich glaube aber, dass For Each und Zuweisung an sich selbst nicht funktioniert, bei mir hat er damals nichts ersetzt, ich musste eine For-Schleife nehmen:

    VB.NET-Quellcode

    1. For i=0 To sArray.Length - 1
    2. str(i) = str(i).Replace("{95}", "_")
    3. Next
    @Drahuverar:: Strings sind Value-Types, im Gegensatz zu Reference-Types.
    Wenn Du willst, dass Eins, Zwei und Drei verändert werden, musst Du sie in eine referenzierbare Klasse packen:
    XString

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim Eins As New XString
    4. Dim Zwei As New XString
    5. Dim Drei As New XString
    6. '...SQL Datenbank befüllt die Werte
    7. Eins.value = "Irgendwas{95}UndSo"
    8. Zwei.value = "Irgendwas{95}UndSo"
    9. Drei.value = "Irgendwas{95}UndSo"
    10. Dim sArray() As XString = {Eins, Zwei, Drei}
    11. For i = 0 To 10
    12. sArray(0).value = sArray(0).value.Replace("{95}", "_")
    13. sArray(1).value = sArray(1).value.Replace("{95}", "_")
    14. sArray(2).value = sArray(2).value.Replace("{95}", "_")
    15. Next
    16. End Sub
    17. End Class
    18. Public Class XString
    19. Inherits Object
    20. Public Property value As String
    21. Public Overrides Function ToString() As String
    22. Return value
    23. End Function
    24. End Class
    Bilder
    • XString.jpg

      51,59 kB, 498×538, 172 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany: Vorsicht. Strings sind eigentlich auch Referenztypen, aber sie sind immutable, was nach außen den Anschein erweckt, sie wären Wertetypen.

    Der Grund: (Brutale Killerspiele) Das Array beinhaltet eine Referenz auf den String. Bei der For-Each-Schleife wird die Referenz in eine lokale Variable kopiert. Das heißt, die lokale Variable und der Eintrag im Array zeigen auf die selbe Stelle im Speicher.
    Wenn man jetzt in der Schleife z.B. i = i.Replace("bla", "blubb") schreibt, dann wird im Arbeitsspeicher, an einer ganz anderen Stelle ein neuer, veränderter String abgelegt und die Referenz darauf wird in der lokalen Variable gespeichert. Also zeigt der Eintrag im Array immer noch an die alte Stelle und somit auf den alten String.

    [/Klugscheißermodus]
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Strings sind eigentlich auch Referenztypen
    Jou, denn sie können auch Nothing sein.
    Strings sind halt anders. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Gonger96 schrieb:

    nichts anderes
    Dann probier mal den Code von Post #1 in Verbindung mit dem genanten Problem aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Code würde mit gar keinem Typen funktionieren, egal ob Wertetyp, Referenztyp, oder Immutable Referenztyp. Grund ist, dass ne Zuweisung immer die Variable verändert, im Falle von Wertetypen wird der neue Wert reingeschrieben und im Falle von Referenztypen wird die Referenz reingeschrieben. Anders ist es, wenn man ne Eigenschaft ändert. Änderst du die Eigenschaft auf ner Wertetypvariablen, so ändert sich nur das Objekt dieser Variablen, änderst du ne Eigenschaft ner Referenztypvariablen, ändert sich das Objekt aller Variablen, die darauf zeigen (oder besser, es ist ja das selbe Objekt).

    Artentus schrieb:

    im Falle von Wertetypen wird der neue Wert reingeschrieben und im Falle von Referenztypen wird die Referenz reingeschrieben.

    Aber genau darum ging es doch von Anfang an in diesem Thread: wie werden Strings behandelt (da sie ein Zwischending bzw. beides sind):

    sonne75 schrieb:

    Die Frage ist ja, wird String hier wie ein Objekt oder wie ein Wert betrachtet? Wird die Referenz im Array gespeichert und somit auch String verändert, oder nur der Wert kopiert, und der String nicht verändert?
    @sonne75: Weil Du bei der For-Schleife einen Eintrag im Array ablegst:

    VB.NET-Quellcode

    1. For i = 0 To DeinArray.Length - 1
    2. DeinArray(i) = DeinArray(i).Replace("Hallo", "Welt")
    3. Next

    Da wird zuerst das i-te Element aus dem Array heraus geholt, dann wird eine veränderte String-Instanz davon erstellt, und anschließend wird diese Instanz im Array abgelegt.
    Das wäre nichts anderes als das hier:

    VB.NET-Quellcode

    1. Dim a = "Hallo"
    2. Dim c = a.Replace("Hallo", "Welt")
    3. a = c

    Da wird der Array-Eintrag überschrieben.

    Bei der For-Each-Schleife sieht der Code so aus:

    VB.NET-Quellcode

    1. For Each Element In DeinArray
    2. Element = Element.Replace("Hallo", "Welt")
    3. Next
    4. 'Und das ergibt (fast, nicht ganz, aber fast) diesen Code:
    5. For i = 0 To DeinArray.Length - 1
    6. Dim Element = DeinArray(i)
    7. Element = Element.Replace("Hallo", "Welt")
    8. Next

    Und wie Du siehst, wird bei letzterem nur die Variable überschrieben, aber der Array-Eintrag wird nicht überschrieben.

    (Um das klarzustellen: Die For-Each-Schleife arbeitet eigentlich ein kleines Bisschen anders, als hier dargestellt, aber es läuft auf das selbe hinaus: Das aktuelle Element wird in einer lokalen Variable abgelegt und dann wird diese überschrieben. Das Array wird nicht verändert.)

    Edit: Im Array wird eine Referenz auf den Originalen String gespeichert. Diese Referenz wird in die lokale Variable kopiert. Anschließend wird die lokale Variable mit einer Referenz auf einen anderen String überschrieben. Davon kann das Array garnichts mitbekommen, denn es zeigt lediglich auf den ursprünglichen String. Und dabei ist es, wie Artentus schon gesagt hat, egal, ob da ein Wertetyp, ein Referenztyp oder ein Mischmasch drin steht, denn wenn man die lokale Variable überschreibt, ändert sich nicht der Eintrag im Array.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils