Textbox: letztes Wort löschen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    @Dancger:
    Ich erklärs mal anhand eines Beispiels:

    VB.NET-Quellcode

    1. Dim text As String = "Ich splitte mich bei allen Leerzeichen"
    2. Dim gesplittet() As String = text.Split(New Char(){" "c, Chr(9), Chr(10), Chr(13))

    Somit enthält gesplittet "Ich", "splitte", "mich", "bei", "allen" und "Leerzeichen". Insgesamt sind das also 6 zumeist neue Einträge im Memory (mit Länge Eintrag.Length * BytesProBuchstabe + 1). Zum Eintrag erstellen wird ebenfalls in einer Schleife durchgegangen und für jeden Buchstaben überprüft, ob er im Array steckt. Anschließend wird dann der Eintrag ausgewertet und in ein Zielarray gepackt. Für die Arrayerstellung gibt es mindestens 3 Möglichkeiten: Erst in einer Schleife den String durchgehen und alle Einträge durchzählen, anschließend das Array instanzieren und erneut durchlaufen, das Array mit jedem Eintrag anpassen, ein Array erzeugen, das bereits m Plätze anbietet und bei Bedarf um o Plätze ergänzen und ganz am Schluss das Array auf die tatsächliche Anzahl der Zeichen zurückkürzen. Variante 1 und 2 sind relativ unperformant, wobei Methode 2 meines Wissens nach am langsamsten sein dürfte. Aber wie man sieht, wird jedes mal die Anzahl der Zeichen bestimmt UND der Text wird in ein weiteres Array gespeichert, was, wie man sieht wirklich unperformant ist, da ein Array nun mal sequentiell angeordnet ist und nur Werte enthält (für Datentypen Zeiger, für Wertetypen Daten, denk ich mal). Zwar bieten manche Prozessoren (soweit ich weiß) Möglichkeiten zur Stringverarbeitung, aber ich denke, dass die herkömmliche Methode über eine Schleife wesentlich besser geeignet ist, zumal IL selbst das wohl nicht zwangsweise unterstützt (hab im Moment keine OP-Code-Tabelle vor mir).

    Lange Rede kurzer Sinn:

    VB.NET-Quellcode

    1. Dim amount As Integer
    2. Dim text As String = "Ich enthalte {0} Leerzeichen."
    3. For Each c As Char In text
    4. If Char.IsWhiteSpace(c) Then
    5. amount += 1
    6. End If
    7. Next
    8. MessageBox(String.Format(text, amount.ToString())

    So sollte das klappen. Strings enthalten einen Zeiger auf den ersten Char und die restlichen Chars sind sequentiell angeornet. Somit ist das eigentlich wieder ein unverwaltetes Array. For Each iteriert dann eben durch alle Chars durch und überprüft auf IsWhiteSpace. Hierbei kann man natürlich noch berücksichtigen, dass die Folge Cr, Lf bzw. Lf, Cr als ein einziger WhiteSpace-Character angesehen wird, aber das ist jetzt ja nicht so wichtig.

    @Lightsource: Soweit ich weiß schon. Habe auch schon lange nicht mehr mit Regex hantiert. Das ist teilweise relativ unpraktisch, da es doch relativ viel Zeit benötigt, einen String in ein Pattern zu packen.

    Gruß
    ~blaze~