Bestimmten Wert aus String ersetzen Kein Replace

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bestimmten Wert aus String ersetzen Kein Replace

    Hallo,

    es hört sich jetzt vllt komisch an, aber ich möchte

    z.B. aus dem String "0000000000000" den vierten Wert durch eine 1 ersetzen. Den Wert auslesen kann ich mit NameDerVariable(4). Allerdings wenn ich Replace("0", "1") mache, dann bekomme ich den String zurück (ist auch logisch): 1111111111111111

    Danke im Vorraus :)
    Hab da schon eine Idee:

    VB.NET-Quellcode

    1. Private Function Hallo(ByVal sValue as sstring, ByVal sIndex as integer, ByVal NewValue as Integer)
    2. For i = 0 To sstring.Length
    3. if sstring(i) = sIndex Then
    4. sstring(i) = NewValue
    5. End Function



    Aber ich hab keine Idee wie ich dann eine bestimmte Stelle ersetzen kann.
    @der_Kurt:
    Ok, es ist zwar schnell geschrieben, aber es ist extrem unleserlich.

    Nebenbei: vergleiche:

    Im ILSpy:


    Mid(Test, 4, 1) = "1"
    wird also vom Compiler zu
    Mid(Test, 4, 1, "1")
    umgemünzt.

    Bei jeder anderen ("normale") Funktion würde es einen Compilerfehler geben:

    VB.NET-Quellcode

    1. Private Sub Test() Handles Button1.Click
    2. GetFoo() = "Bar"
    3. End Sub
    4. Private Function GetFoo() As String
    5. Return "Foo"
    6. End Function

    Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden.


    Also meiner Meinung nach ist es immer noch ein ziemliches Gefrickel.


    Um auch was zur Problemlösung beizutragen:

    VB.NET-Quellcode

    1. Dim Test As String = "00000000"
    2. Dim Index As Integer = 3
    3. Dim SB As New System.Text.StringBuilder
    4. SB.Append(Test, 0, Index)
    5. SB.Append("1"c)
    6. SB.Append(Test, Index + 1, Test.Length - Index - 1)
    7. MessageBox.Show(SB.ToString)

    vom Prinzip her macht das auch das Mid-Dings, dem man den Wert zuweist.
    Der StringBuilder könnte bei größeren Texten schneller sein. Getestet habe ich es aber nicht.

    Eine Variante, die mir besser gefällt:

    VB.NET-Quellcode

    1. Dim Test As String = "00000000"
    2. Dim Index As Integer = 3
    3. Dim Temp As String = Test.Remove(Index) & "1"c & Test.Substring(Index + 1)
    4. MessageBox.Show(Test)

    Sieht für mich nicht wirklich unübersichtlich aus, verwendet keine wirklich komplizierten und unnachvollziehbaren Berechnungen.
    Wie es mit der Geschwindigkeit aussieht weiß ich aber nicht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Falls es jemand interessiert ich habs mal durchlaufen lassen ... Die schnellste Methode is die übers CharArray
    Danach mit etwas Abstand aber recht gleich Stringbuilder und Remove, etwas Abgeschagen die MID-Variante.
    Allerdings reden wir hier "nur" über einen Abstand von max 10sec bei 100 Millionen Datenänderungen. Das heßt bei 1 Millionen Datensätzen is das alles in Bruchteilen einer Sekunde geregelt.
    Hier der Test
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Const str As String = "Keeeeeeeeekse"
    3. Const loops As Integer = 100000000
    4. Dim dicResult As New Dictionary(Of String, TimeSpan)
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Dim stp As New Stopwatch
    7. Dim tmp As String = ""
    8. stp.Start()
    9. For i = 1 To loops
    10. tmp = viaArray(str, 2, "A"c)
    11. Next
    12. stp.Stop()
    13. dicResult.Add("Mit viaArray: ", stp.Elapsed)
    14. stp.Restart()
    15. For i = 1 To loops
    16. tmp = viaRem(str, 3, "R"c)
    17. Next
    18. stp.Stop()
    19. dicResult.Add("Mit viaRemove: ", stp.Elapsed)
    20. stp.Restart()
    21. For i = 1 To loops
    22. tmp = viaMid(str, 4, "M"c)
    23. Next
    24. stp.Stop()
    25. dicResult.Add("Mit viaMid: ", stp.Elapsed)
    26. stp.Restart()
    27. For i = 1 To loops
    28. tmp = viaSB(str, 5, "S"c)
    29. Next
    30. stp.Stop()
    31. dicResult.Add("Mit viaStringbuilder: ", stp.Elapsed)
    32. For Each el In dicResult
    33. Label1.Text &= el.Key & el.Value.TotalSeconds.ToString & vbNewLine
    34. Next
    35. End Sub
    36. Private Function viaArray(ByVal _str As String, ByVal _index As Integer, ByVal _newChar As Char) As String
    37. Dim cArr() As Char = _str.ToCharArray
    38. cArr(_index) = _newChar
    39. Return cArr.ToString
    40. End Function
    41. Private Function viaRem(ByVal _str As String, ByVal _index As Integer, ByVal _newChar As Char) As String
    42. Return (_str.Remove(_index) & _newChar & _str.Substring(_index + 1))
    43. End Function
    44. Private Function viaMid(ByVal _str As String, ByVal _index As Integer, ByVal _newChar As Char) As String
    45. Mid(_str, _index, 1) = _newChar
    46. Return _str
    47. End Function
    48. Private Function viaSB(ByVal _str As String, ByVal _index As Integer, ByVal _newChar As Char) As String
    49. Dim SB As New System.Text.StringBuilder
    50. SB.Append(_str, 0, _index)
    51. SB.Append(_newChar)
    52. SB.Append(_str, _index + 1, _str.Length - _index - 1)
    53. Return SB.ToString
    54. End Function
    55. End Class
    Bilder
    • String-01.gif

      35,9 kB, 305×306, 124 mal angesehen

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

    der_Kurt schrieb:

    Jetzt seid ihr dran ;) :
    Ganz sauber:

    VB.NET-Quellcode

    1. Dim txt As String = "0000000000000"
    2. Dim cc() As Char = txt.ToArray
    3. cc(4) = "1"c
    4. Dim txt2 As String = cc
    5. MessageBox.Show(txt2)
    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!