Portierung von JS code in VB.Net

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von BitBrösel.

    Portierung von JS code in VB.Net

    Hallo zusammen,

    ich habe folgende Codezeile in Javascript:

    Quellcode

    1. var data = (s + "").split("");


    s ist hier ein String.

    Soweit ich das beim Debuggen gesehen habe ist das wohl ein Array mit Datentyp Character.
    Wie würde ich das in VB.NET umsetzen?

    Mit .toCharArray kann ich keinen Separator angeben.
    Und mit String.Split bekomme ich auch nur ein Array mit Länge 1 zurück.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    In solchen Fällen, lohnt sich immer ein Blick in die Doku, wie auch mal zu probieren was rauskommt. Probiere mal diesen Schnipsel:

    HTML-Quellcode

    1. <!DOCTYPE HTML>
    2. <html>
    3. <body>
    4. <a id="ida"></a>
    5. <script>
    6. var element = document.getElementById("ida");
    7. var data = ("TEST").split("");
    8. console.log(data);
    9. for(var i = 0; i < data.length; i++)
    10. {
    11. element.innerHTML += data[i] + "<br>";
    12. }
    13. </script>
    14. </body>
    15. </html>

    Bei String.ToCharArray() wird aus dem String ein Array von Chars angelegt, Position im Array = Position im String. Da braucht man also keinen Seperator, weil ja jedes Zeichen einen Index bekommt. Mit String.ToCharArray() hast du also bereits die Lösung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    @BitBrösel

    Danke für deine Antwort, String.ToCharArray hat tatsächlich genau so funktioniert wie es soll.

    Ich nun habe ich noch ein weiteres Problem.
    Ich versuche ja nicht nur eine Zeile JS Code in VB umzusetzen, sondern eine ganze Funktion. Leider macht diese noch nicht ganz was sie soll.
    Falls hier jemand noch unterstützen könnte wäre das super.

    Dies ist die Quellfunktion:

    Quellcode

    1. function testjs(s) {
    2. var dict = {};
    3. var data = (s + "").split("");
    4. var currChar = data[0];
    5. var oldPhrase = currChar;
    6. var out = [currChar];
    7. var code = 256;
    8. var phrase;
    9. for (var i=1; i<data.length; i++) {
    10. var currCode = data[i].charCodeAt(0);
    11. if (currCode < 256) {
    12. phrase = data[i];
    13. }
    14. else {
    15. phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
    16. }
    17. out.push(phrase);
    18. currChar = phrase.charAt(0);
    19. dict[code] = oldPhrase + currChar;
    20. code++;
    21. oldPhrase = phrase;
    22. }
    23. return out.join("");
    24. }


    Das ist meine aktuelle Version der umgesetzten Funktion in VB:

    VB.NET-Quellcode

    1. Private Function testvb(ByVal s As String) As String
    2. Dim dict As New Dictionary(Of Integer, Char)
    3. Dim data As Char() = s.ToCharArray
    4. Dim currchar As String = data(0)
    5. Dim oldphrase As String = currchar
    6. Dim out As Char() = {currchar}
    7. Dim code As Integer = 256
    8. Dim phrase As String = ""
    9. For i As Integer = 1 To data.Length - 1
    10. Dim currcode As Integer = Convert.ToInt16(data(i))
    11. If currcode < 256 Then
    12. phrase = data(i)
    13. Else
    14. If phrase = dict(currcode) Then
    15. phrase = dict(currcode)
    16. Else
    17. phrase = oldphrase + currchar
    18. End If
    19. End If
    20. ReDim Preserve out(out.Length)
    21. out(out.Length - 1) = phrase(0)
    22. currchar = phrase
    23. dict.Item(CStr(code)) = oldphrase + currchar
    24. code += 1
    25. oldphrase = phrase
    26. Next
    27. Dim ret As String = New String(out)
    28. Return ret
    29. End Function


    Beim Codeabschnitt

    VB.NET-Quellcode

    1. If phrase = dict(currcode) Then
    2. phrase = dict(currcode)
    3. Else
    4. phrase = oldphrase + currchar
    5. End If


    fliegt das Programm auf die Nase, weil der Dictionary Key nicht im Dictionary enthalten ist.
    Ich bin mir allerdings nicht 100%ig sicher ob ich den ?-Operanden aus JS korrekt umgesetzt habe.

    nicerdicer schrieb:

    fliegt das Programm auf die Nase, weil der Dictionary Key nicht im Dictionary enthalten ist.



    Dann wäre es doch schlau erstmal zu testen ob der Key im Dictionary existiert. Probiere mal:

    VB.NET-Quellcode

    1. If dict.ContainsKey(currcode) Then
    2. If phrase = dict.Values(currcode) Then
    3. phrase = dict.Values(currcode)
    4. Else
    5. phrase = oldphrase + currchar
    6. End If
    7. Else
    8. 'wenn der key nicht existiert, brauchen wir auch diesen else Zweig, wir können ja nicht mit einem nicht vorhandenen key vergleichen
    9. phrase = oldphrase + currchar
    10. End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    Ich habe das mal getestet, leider ist der return String noch falsch.
    Zusätzlich habe ich noch gemerkt dass das Dictionary falsch ist, hier musste ich es auf Dictionary of Integer, String ändern, da Phrase und Oldphrase keine Char Variablen sind sondern String.
    Hier die aktuelle Funktion:

    VB.NET-Quellcode

    1. Private Function testvb(ByVal s As String) As String
    2. Dim dict As New Dictionary(Of Integer, String)
    3. Dim data As Char() = s.ToCharArray
    4. Dim currchar As String = data(0)
    5. Dim oldphrase As String = currchar
    6. Dim out As String() = {currchar}
    7. Dim code As Integer = 256
    8. Dim phrase As String = ""
    9. Dim ret As String = ""
    10. For i As Integer = 1 To data.Length - 1
    11. Dim currcode As Integer = Convert.ToInt16(data(i))
    12. If currcode < 256 Then
    13. phrase = data(i)
    14. Else
    15. If dict.ContainsKey(currcode) Then
    16. If phrase = dict.Values(currcode) Then
    17. phrase = dict.Values(currcode)
    18. Else
    19. phrase = oldphrase + currchar
    20. End If
    21. Else
    22. 'wenn der key nicht existiert, brauchen wir auch diesen else Zweig, wir können ja nicht mit einem nicht vorhandenen key vergleichen
    23. 'phrase = oldphrase + currchar
    24. End If
    25. End If
    26. ReDim Preserve out(out.Length)
    27. out(out.Length - 1) = phrase
    28. currchar = phrase(0)
    29. dict.Item(code) = oldphrase + currchar
    30. code += 1
    31. oldphrase = phrase
    32. Next
    33. For Each str As String In out
    34. ret = ret + str
    35. Next
    36. Return ret
    37. End Function


    Edit:
    Ich kann in diesem Thread keinen Beitrag mehr schreiben?

    Ich habe mal einen Teststring angelegt:

    Quellcode

    1. DasIsteinTeĄStćgFürVBParadise


    Wenn man diesen Parameter s in der Funktion nutzt sollte folgendes zurückgegeben werden:

    Quellcode

    1. DasIsteinTestStingFürVBParadise

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nicerdicer“ ()

    nicerdicer schrieb:

    Ich kann in diesem Thread keinen Beitrag mehr schreiben?

    Solltest du nach einer gewissen zeit wieder können, wenn jemand geantwortet hat, kannst du auch sofort wieder schreiben.
    Bei mir hatte sich gestern ein gravierender Fehler eingeschlichen. Aber ich hab das gerade bemerkt, das sollte es sein:

    VB.NET-Quellcode

    1. Private Function testvb(s As String) As String
    2. If String.IsNullOrEmpty(s) Then
    3. return s
    4. End If
    5. Dim dict As New Dictionary(Of Char, String)
    6. Dim currchar As Char = s(0)
    7. Dim oldphrase As String = currchar
    8. Dim out As String = currchar
    9. Dim code As Integer = 256
    10. Dim phrase As String = ""
    11. For i As Integer = 1 To s.Length - 1
    12. Dim currcode As Char = s(i)
    13. If Convert.ToInt16(currcode) < 256 Then
    14. phrase = s(i)
    15. Else
    16. If dict.ContainsKey(currcode) Then
    17. phrase = dict(currcode)
    18. Else
    19. phrase = oldphrase & currchar
    20. End If
    21. End If
    22. out &= phrase
    23. currchar = phrase(0)
    24. dict.Add(ChrW(code), oldphrase & currchar)
    25. code += 1
    26. oldphrase = phrase
    27. Next
    28. Return out
    29. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()