x mal string

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    x mal string

    hi, ich wollte x mal einen string anzeigen lassen
    also praktisch so:

    VB.NET-Quellcode

    1. Dim iText as string = 5 * "|test|"

    ^^ das geht natürlich nicht, also hab ich mir eine Function gemacht:

    VB.NET-Quellcode

    1. Dim FinalString As String
    2. Private Function x_mal_string(ByVal x_mal As Integer, ByVal string_text As String)
    3. FinalString = ""
    4. For i As Integer = 1 To x_mal
    5. FinalString = FinalString + string_text
    6. If i = x_mal Then
    7. Return FinalString
    8. Exit For
    9. End If
    10. Next
    11. Return ""
    12. End Function


    klappt alles so wie es soll, blos, geht das evtl auch kürzer? jemand ne ahnung?

    VB.NET-Quellcode

    1. Private Function x_mal_string(ByVal x_mal As Integer, ByVal string_text As String) As String
    2. Dim FinalString As String = ""
    3. For i As Integer = 1 To x_mal
    4. FinalString = FinalString & string_text
    5. Next
    6. Return FinalString
    7. End Function
    Bitte! VB Tags benutzen – aber richtig

    vor allem: Option Strict On!

    Edit: + -Operator auf & geändert

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

    Hi

    VB.NET-Quellcode

    1. If i = x_mal Then

    ist überflüssig, da ja eigentlich die for-Schleife bereits für für dich bis x_mal zählt. Exit For würde nach einem Return übrigens nicht mehr erreicht. Ebenso würde man FinalString im Methodenkörper definieren und die Funktion selber als statisch deklarieren, da eine Instanz gar nicht von Nöten ist.

    VB.NET-Quellcode

    1. Private Shared Function RepeatString(ByVal repeatedText As String, ByVal repetitionCount As Integer) As String
    2. If repetitionCount > 0 Then
    3. Dim returnValue As String = repeatedText
    4. For i As Integer = 2 To repetitionCount
    5. returnValue += repeatedText
    6. Next
    7. Return returnValue
    8. ElseIf repetitionCount = 0 Then
    9. Return String.Empty
    10. Else
    11. Throw New ArgumentOutOfRangeException("repetitionCount")
    12. End If
    13. End Function

    Insgesamt ist es übrigens empfehlenswert statt einer ständigen String-Verknüpfung einen StringBuilder oder Dergleichen zu verwenden:

    VB.NET-Quellcode

    1. Private Shared Function RepeatString(ByVal repeatedText As String, ByVal repetitionCount As Integer) As String
    2. If repetitionCount > 0 Then
    3. Dim returnValue As New System.Text.StringBuilder(repetitionCount * repeatedText.Length)
    4. For i As Integer = 1 To repetitionCount
    5. returnValue.Append(repeatedText)
    6. Next
    7. Return returnValue.ToString()
    8. ElseIf repetitionCount = 0 Then
    9. Return String.Empty
    10. Else
    11. Throw New ArgumentOutOfRangeException("repetitionCount")
    12. End If
    13. End Function

    Bei einem String würde durch das Verwenden des +- bzw. &-Operators ständig eine neue String-Instanz angelegt. Es ist meistens empfehlenswert, einfach einen StringBuilder oder bei einer a + b + c-Situation String.Concat oder String.Join zu verwenden.

    @Dodo
    solange man weiß, dass man es richtig verwendet hat, darf man's. ;)

    Gruß
    ~blaze~
    Er wollte die Funktion kürzer .. hier ein Einzeiler *g*

    VB.NET-Quellcode

    1. Private Function StringRepeat(s As String, c As Integer) As String
    2. Return String.Join(s, New String(c) {})
    3. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ () aus folgendem Grund: (kl. Korrektur)

    Nun, der TE fragt nach der "kürzesten" Methode.
    Der Ultra-LINQ-Holzhammer von picoflop ist da nunmal sehr kurz. Allerdings ist er wahrscheinlich auch um einiges langsamer als die Methode von blaze mit StringBuilder+Capacity-Angabe.

    Wir können ja mal ein Profiling machen. Mich interessiert, ob Dodos oder die von blaze vorgeschlagene Methode schneller ist. Ich Tippe auf die von blaze. ;)
    Obwohl:
    Ich sehe gerade, dass die Join-Methode nicht einfach alles aneinander klatscht und zurückgibt. Es wird berechnet, welche Stringgröße benötigt wird, dann wird der Platz reserviert und anschließend mit einer For-Schleife, einem "UnSafeCharBuffer" (?) und char-Pointer gefüllt.
    Von meinem iPhone gesendet

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

    Natürlich hat ~blaze~ nen Code gepostet - nur nicht in seinem letzten Post...

    ~blaze~ schrieb:

    VB.NET-Quellcode

    1. Private Shared Function RepeatString(ByVal repeatedText As String, ByVal repetitionCount As Integer) As String
    2. If repetitionCount > 0 Then
    3. Dim returnValue As New System.Text.StringBuilder(repetitionCount * repeatedText.Length)
    4. For i As Integer = 1 To repetitionCount
    5. returnValue.Append(repeatedText)
    6. Next
    7. Return returnValue.ToString()
    8. ElseIf repetitionCount = 0 Then
    9. Return String.Empty
    10. Else
    11. Throw New ArgumentOutOfRangeException("repetitionCount")
    12. End If
    13. End Function
    Ich hätte noch nen Einzeiler mit dem Stringbuilder ^^

    VB.NET-Quellcode

    1. Private Function Repeat(ByVal s As String, ByVal count As Int32) As String
    2. Return New StringBuilder().Insert(0, s, count).ToString()
    3. End Function
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich habe mal folgende Methoden getestet:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Text
    2. Module Module1
    3. Sub Main()
    4. Dim sw As New Stopwatch()
    5. Const targetCount As Integer = 5000
    6. Const targetstring As String = "test"
    7. sw.Start()
    8. For i As Integer = 0 To targetCount
    9. Repeat1(targetstring, i)
    10. Next
    11. sw.Stop()
    12. Console.WriteLine("Repeat1: " & sw.Elapsed.ToString())
    13. sw.Reset()
    14. sw.Start()
    15. For i As Integer = 0 To targetCount
    16. Repeat2(targetstring, i)
    17. Next
    18. sw.Stop()
    19. Console.WriteLine("Repeat2: " & sw.Elapsed.ToString())
    20. sw.Reset()
    21. sw.Start()
    22. For i As Integer = 0 To targetCount
    23. Repeat3(targetstring, i)
    24. Next
    25. sw.Stop()
    26. Console.WriteLine("Repeat3: " & sw.Elapsed.ToString())
    27. sw.Reset()
    28. sw.Start()
    29. For i As Integer = 0 To targetCount
    30. Repeat4(targetstring, i)
    31. Next
    32. sw.Stop()
    33. Console.WriteLine("Repeat4: " & sw.Elapsed.ToString())
    34. sw.Reset()
    35. sw.Start()
    36. For i As Integer = 0 To targetCount
    37. Repeat5(targetstring, i)
    38. Next
    39. sw.Stop()
    40. Console.WriteLine("Repeat5: " & sw.Elapsed.ToString())
    41. sw.Reset()
    42. Console.WriteLine("Done.")
    43. Console.ReadKey()
    44. End Sub
    45. Private Function Repeat1(ByVal repeatedText As String, ByVal repetitionCount As Integer) As String
    46. Dim finalString As String = ""
    47. For i As Integer = 1 To repetitionCount
    48. finalString = finalString & repeatedText
    49. Next
    50. Return finalString
    51. End Function
    52. Private Function Repeat2(ByVal repeatedText As String, ByVal repetitionCount As Integer) As String
    53. If repetitionCount > 0 Then
    54. Dim returnValue As New System.Text.StringBuilder(repetitionCount * repeatedText.Length)
    55. For i As Integer = 1 To repetitionCount
    56. returnValue.Append(repeatedText)
    57. Next
    58. Return returnValue.ToString()
    59. ElseIf repetitionCount = 0 Then
    60. Return String.Empty
    61. Else
    62. Throw New ArgumentOutOfRangeException("repetitionCount")
    63. End If
    64. End Function
    65. Private Function Repeat3(repeatedText As String, repetitionCount As Integer) As String
    66. Return String.Join(repeatedText, New String(repetitionCount) {})
    67. End Function
    68. Private Function Repeat4(repeatedText As String, repetitionCount As Integer) As String
    69. Return String.Concat(From i In Enumerable.Range(1, repetitionCount) Select (repeatedText))
    70. End Function
    71. Private Function Repeat5(ByVal repeatedText As String, ByVal repetitionCount As Int32) As String
    72. Return New StringBuilder().Insert(0, repeatedText, repetitionCount).ToString()
    73. End Function
    74. End Module


    Ergebnis für den string "test" und 5000 durchläufen:

    Quellcode

    1. Repeat1: 00:01:07.1700500 (EDRs Methode)
    2. Repeat2: 00:00:00.2725852 (blazes Methode)
    3. Repeat3: 00:00:00.2764665 (Dodos Methode)
    4. Repeat4: 00:00:00.6538702 (picoflops Methode)
    5. Repeat5: 00:00:00.3781475 (Monos Methode)


    Ergebnis für den string "dsafklhadsijfgadsfjahdsfgojashdgfhjasdfgsajkhdfgaskjdfghkjahsdfhdsfgadsjnfgjkldsfgljkfhpejrfhbvjkesvgjhrev" und 5000 Durchläufen:

    Quellcode

    1. Repeat1: <weggelassen, da eh zu langsam>
    2. Repeat2: 00:00:05.4399875
    3. Repeat3: 00:00:02.6048455
    4. Repeat4: 00:00:05.4496000
    5. Repeat5: 00:00:05.3042654


    "test" und 20000 Durchläufe:

    Quellcode

    1. Repeat1: <weggelassen, da eh zu langsam>
    2. Repeat2: 00:00:05.5747347
    3. Repeat3: 00:00:04.9412383
    4. Repeat4: 00:00:10.7077135
    5. Repeat5: 00:00:06.8359057


    Sieht so aus, als wäre Repeat3 (Dodos Methode) die schnellste (besonders bei langen Strings). Korrigiert mich, wenn ich falsch profile.
    Von meinem iPhone gesendet
    no - dann müsst ihr aber auch noch Mono2 testen ;)

    VB.NET-Quellcode

    1. Private Function Repeat6(ByVal s As String, ByVal count As Int32) As String
    2. Return New StringBuilder().Append( s, 0, count).ToString()
    3. End Function

    Wie immer bei so kleinlichen Optimierungsfragen: Die Geschwindigkeit ist hier vollkommen irrelevant - Rules Of Optimization

    Monos Methode ist deshalb die beste, weil sie am einfachsten ist, nicht weil am schnellsten.

    Edit: Sorry-Dodo: Deine Methode ist ebenso genial und die beste - also ich kann mich jetzt nicht entscheiden :thumbup:
    hatte den Überblick verloren

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

    Das heißt überhaupt nichts, ich habe noch nie in meinem Leben ein Buch über Programmierung in den Händen gehabt geschweige denn irgendwas ähnliches gelesen. Man bekommt alles was man benötigt über Dokumentationen und Referenzen wie MSDN (im Falle von VB) ansonsten Try and Error is immernoch das beste Lernprinzip. Und natürlich der Wille und logisches Denken. Bücher und Tutorials braucht man nicht, außer manche vlt. die Grundzüge zum verstehen, alles andere darin is nur abgetippe/kopiererei und letztendlich lernt der Betreffende nichts!
    Ich denke ein Buch zu lesen kann nicht schaden.
    Vor allem um auch Anregungen zu bekommen, um über gewisse Dinge und Herangehensweisen nachzudenken, zum anderen um zu sehen, welche der teilweise vielen Möglichkeiten verwendet der Autor und warum.
    Das ist meine Signatur und sie wird wunderbar sein!