Textbox.text to Int array

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    @vico255 Bedenke, dass in der TextBox auch "Roulade mit Klößen" stehen könnte.
    Was genau soll Dein Programm damit tun?
    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!
    Da stehen aber keine Klöse drin :)

    VB.NET-Quellcode

    1. Textbox.text = "312"

    soll

    VB.NET-Quellcode

    1. {3,1,2}

    werden.

    VB.NET-Quellcode

    1. Array.ConvertAll(bla.TextBox.Text.ToCharArray, Function(c) Asc(c))

    liefert mir bei "222" gleich {50,50,50}

    edit:

    VB.NET-Quellcode

    1. Array.ConvertAll(bla.TextBox.Text.ToCharArray, Function(c) Asc(c))-48

    wäre dann mein Ergebnis


    edit2
    Lösung meines Problems ist:

    VB.NET-Quellcode

    1. Array.ConvertAll(bla.TextBox.Text.ToCharArray, Function(c) Int32.Parse(c))

    In Arbeit...

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

    Mir persönlich gefällt diese Variante am Besten

    VB.NET-Quellcode

    1. Dim arr = Encoding.UTF8.GetBytes(TextBox1.Text.Trim).Select(Function(c) c - 48I).ToArray


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @vico255 Ich hab jetzt den Code vom EDR nicht getestet, aber ich geh mal davon aus, dasser so läuft.
    Da wird das ToCharArray() implizit und das Parsen als Delegate übergeben.
    Ist grundsätzlich identisch, da kannst Du nehmen, was Dir besser gefällt.
    Wenn das mit großen Datenmengen aufgerufen wird, lohnt sich ggf. ein Performance-Test.
    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 von EDR funktioniert und gefällt mir vom dem her, dass diese Möglichkeit eine Auwahl offen lässt in was für einen Type gecastet werde soll.
    Bedingt aber, dass der Teil TextBox1.Text.ToArray in der ConvertAll-Funktion für dieses Beispiel eine z.B. char-, oder string-Array ist.
    Es kann problemlos mit dem zweiten Parameter auch in Byte, Double und andere Datentypen gecastet werden.

    VB.NET-Quellcode

    1. Dim arr = Array.ConvertAll(TextBox1.Text.ToArray, AddressOf Single.Parse)


    Bei meiner Variante oben (#5), wird der String zuerst in eine Byte-Array, und erst nachher mittel LINQ zu einem Int-Array umgewandelt wird. Die Zahl 48 entspricht der Differenz der Zahlenwerte im Ascii-Code.

    Um was über Performence sagen zu können, müsste es getestet werden. Im Normalfall solte man mit Cast in andere Datentypen sparsam umgegangen werden. Das wäre meine Vorgehensweise.

    Edit: Test
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Ich kenne im Moment keine schnellere Methode,
    2. 'wenn es wirklich mal darauf ankommen würde
    3. Option Strict On
    4. Option Explicit On
    5. Imports System.Text
    6. Imports System.Windows.Forms
    7. Public Module Module1
    8. Private rand As New Random
    9. Public Sub Main()
    10. Dim str As String
    11. Dim sw1 As New Stopwatch
    12. Dim sw2 As New Stopwatch
    13. Dim t1, t2 As Int64
    14. t1 = 0 : t2 = 0
    15. Dim a1(), a2() As Int32
    16. For i As Int32 = 0 To 1000 - 1
    17. str = GetNumRngString(rand.Next(1000, 10000))
    18. sw1.Restart()
    19. a1 = GetCast1(str)
    20. sw1.Stop()
    21. t1 += sw1.ElapsedMilliseconds
    22. sw2.Restart()
    23. a2 = GetCast2(str)
    24. sw2.Stop()
    25. t2 += sw2.ElapsedMilliseconds
    26. Next
    27. Console.WriteLine(t1)
    28. Console.WriteLine(t2)
    29. Console.ReadLine()
    30. End Sub
    31. Private Function GetCast1(ByVal str As String) As Int32()
    32. Return str.Select(AddressOf Int32.Parse).ToArray
    33. 'Return Array.ConvertAll(str.ToCharArray, AddressOf Int32.Parse)
    34. End Function
    35. Private Function GetCast2(ByVal str As String) As Int32()
    36. 'Sehr schnelle Variante
    37. Return Encoding.UTF8.GetBytes(str.Trim).Select(Function(c) c - 48I).ToArray()
    38. End Function
    39. Private Function GetNumRngString(ByVal size As Int32) As String
    40. Dim numstr As String = "0123456789"
    41. Dim res As New StringBuilder(size)
    42. For i As Int32 = 0 To size - 1
    43. res.Append(numstr(rand.Next(numstr.Length)))
    44. Next
    45. Return res.ToString
    46. End Function
    47. End Module


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „exc-jdbi“ ()

    äh - nee, sorry - meins fonzeniert so leider nicht, muss so:

    VB.NET-Quellcode

    1. dim ints = Array.ConvertAll(bla.TextBox.Text.ToCharArray, AddressOf Int32.Parse)

    oder so:

    VB.NET-Quellcode

    1. dim ints = bla.TextBox.Text.Select(AddressOf Int32.Parse).ToArray


    Zur Frage nach den Unterschieden: - zunächstmal die Gemeinsamkeiten:
    Int32.Parse(Char) ist eine Methode, die einen Char in einen Integer umwandelt.
    AddressOf Int32.Parse ist ein Delegat (also quasi ein Zeiger) auf diese Methode.

    Jo, so einen Delegaten kann man der Array.ConvertAll - Methode übergeben dann kann die All konvertieren.

    Man kann mit dem Delegaten aber auch den Linq-Selector aufrufen, dann selektiert er die Chars, und wandelt jedes in ein Int32. - zum Schluss muss man noch .ToArray anhängen, wenn man ein Int-Array haben will.

    Array.ConvertAll gibts schon sehr lange, ist aber in Vergessenheit geraten, weil Linq-Selectoren das wie gezeigt auch können, und sieht sogar bischen eleganter aus. V.a. ist Linq vielseitiger einsetzbar, wird deshalb viel eingesetzt, und deshalb gerät Array.ConvertAll in Vergessenheit.

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