[VB.NET] Meerdere characters replacen

Pagina: 1
Acties:

  • monnick
  • Registratie: December 2005
  • Niet online
Ik ben net begonnen met VB .NET. Nu ben ik bezig met een simpel tooltje dat een string omzet naar morse code. Op msdn.microsoft.com heb ik hiervoor de functie replace() gevonden. Bij die documentatie staat een uitgebreid voorbeeld, echter hier word 1 teken omgezet in 1 ander teken. Wat ik moet doen voor mijn tooltje is meerdere dingen replacen. Als ik doe:

Visual Basic:
1
2
3
4
5
6
7
Dim startString As String
Dim endString As String

startString = txtInput.Text
endString = startString.ToLower()
' De letters
endString = startString.Replace("a", ".- ")

Dan werkt dat goed, als er een a in de tekst zit wordt deze keurig ge-replaced. Alleen het probleem, als ik meerdere tekens wil replacen doe ik dat als volgt:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Dim startString As String
Dim endString As String

startString = txtInput.Text
endString = startString.ToLower()
' De letters
endString = startString.Replace("a", ".- ")
endString = startString.Replace("b", "-... ")
endString = startString.Replace("c", "-.-. ")
endString = startString.Replace("d", "-.. ")
endString = startString.Replace("e", ". ")
endString = startString.Replace("f", "..-. ")

Dit geeft dus een probleem. Alleen de laatste letter word ge-replaced. (in dit voorbeeld de F). De ABCDE worden dus niet ge-replaced. Nu is mijn vraag, hoe kan ik het maken zodat ze allemaal worden veranderd?

Ik heb al gegoogled en gezocht in de MSDN library, geen resultaten helaas.

BTW. Ik ben een beginner met VB.NET, als ik het verkeerd aanpak heb ik graag dat iemand mij daar op wijst. :o

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet doen

C#:
1
2
3
endString = startString.Replace( "a", ".-" );
endString = endString.Replace("b", "-... ");
....

Jij overschijft endString nu telken opniew. startString wordt namenlijk niet gewijzigd door de Replace. Hij geeft alleen een nieuwe string terug.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • monnick
  • Registratie: December 2005
  • Niet online
Oke dank. Trouwens stom dat ik daar niet opgekomen ben. Ik heb immers al ervaring met PHP. :/

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Idd in PHP zou het precies hetzelfde gaan ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • monnick
  • Registratie: December 2005
  • Niet online
In PHP zou ik alles in een array gestopt hebben. De key is het teken dat veranderd moet worden en de value is de vervanging. En dan iets van:

PHP:
1
str_replace(array_values($array), array_keys($array), $input);

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
zon functie is natuurlijk eenvoudig zelf te maken
code:
1
2
3
4
5
6
7
8
public string StrReplace( string input, string[] toReplace, string[] replaceWith )
{
    for(int i =0; i < toReplace.Length; i++ )
    {
        input = input.Replace( toReplace[i], replaceWith[i] );
    }
    return input;
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • monnick
  • Registratie: December 2005
  • Niet online
rwb schreef op dinsdag 12 september 2006 @ 22:03:
zon functie is natuurlijk eenvoudig zelf te maken
code:
1
2
3
4
5
6
7
8
public string StrReplace( string input, string[] toReplace, string[] replaceWith )
{
    for(int i =0; i < toReplace.Length; i++ )
    {
        input = input.Replace( toReplace[i], replaceWith[i] );
    }
    return input;
}
Dank, maar dat is natuurlijk PHP en ik ben nu even bezig in VB.NET. Hoewel het voor mij natuurlijk niet zo moeilijk is jouw code om te zetten naar VB. Ik zal er nog wel eens naar kijken.

Om er meteen nog maar een vraagje achteraan te gooien: Iemand die weet welke functie ik in VB.NET kan gebruiken ipv strrev() in PHP. Voor de mensen die strrev niet kennen: deze functie keert een string simpel weg om.

En ja, ik heb gegoogled en gezocht op msdn. Onder andere op revert a string en dat soort woorden, weer geen resulaat :(

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 17:04

Reptile209

- gers -

monnick schreef op dinsdag 12 september 2006 @ 22:07:
[...]
Om er meteen nog maar een vraagje achteraan te gooien: Iemand die weet welke functie ik in VB.NET kan gebruiken ipv strrev() in PHP. Voor de mensen die strrev niet kennen: deze functie keert een string simpel weg om.

En ja, ik heb gegoogled en gezocht op msdn. Onder andere op revert a string en dat soort woorden, weer geen resulaat :(
Alstu ;).
Maar eerlijk is eerlijk, ik ben gaan [google=vb invert string], dus net effe anders :)

Zo scherp als een voetbal!


  • monnick
  • Registratie: December 2005
  • Niet online
Dank voor je reactie. In middels had ik toen ik in het Nederlands ging zoeken het volgende gevonden:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Text1_Change()
Dim tekst As String
Dim omgekeerde_tekst As String
Dim teller As Integer
tekst = Text1.Text

lengte = Len(tekst)
Text3.Text = "De lengte bedraagt " + CStr(lengte) + " tekens."
omgekeerde_tekst = ""
For teller = lengte To 1 Step -1
  omgekeerde_tekst = omgekeerde_tekst + Mid(tekst, teller, 1)
  Text2.Text = omgekeerde_tekst
Next teller


Gelukkig werkt strReverse() stukken makkelijker. ;)

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 17:04

Reptile209

- gers -

Aan de andere kant is het helemaal uitwerken van zo'n functie - zoals in je eigen voorbeeld - juist een hele handige manier om een taal te leren. Pruts eerst net zolang zelf totdat het (redelijk) werkt en ga dan op zoek naar iemand die het beter gedaan heeft. En pik dan die verbeteringen op ter leerhinghe ende vermaeck :).

Zo scherp als een voetbal!


Verwijderd

monnick, afgezien van je startString/endString probleempje (en ik neem aan dat je nu wel valid morse code terugkrijgt?):
.NET en C# kunnen erg slecht tegen dingen als "endString = endString_maar_dan_net_ietsje_anders".
't Werkt wel, maar door de manier waarop .NET met strings omgaat (strings zijn ook objecten, en bij het heen-en-weer copieren van de inhoud moet .NET continue unboxen/boxen) wordt 't ontzettend langzaam.

Toen ik net begon met C# deed ik 't ook op jouw manier, want bij Delphi (mijn achtergrond) kost 't ook niet zoveel om een string te vervangen door een aangepaste string. Maar bij een redelijk grote functie die steeds 1 output-string aanpaste kostte 't op een gegeven moment 20 minuten om die functie af te ronden. Door een StringBuilder te gebruiken kon ik dat tot 4 seconden terugbrengen... ;)

Edit: O ja, ditzelfde geldt ook voor VB.NET.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 12 september 2006 @ 23:19:
monnick, afgezien van je startString/endString probleempje (en ik neem aan dat je nu wel valid morse code terugkrijgt?):
.NET en C# kunnen erg slecht tegen dingen als "endString = endString_maar_dan_net_ietsje_anders".
't Werkt wel, maar door de manier waarop .NET met strings omgaat (strings zijn ook objecten, en bij het heen-en-weer copieren van de inhoud moet .NET continue unboxen/boxen) wordt 't ontzettend langzaam.

Toen ik net begon met C# deed ik 't ook op jouw manier, want bij Delphi (mijn achtergrond) kost 't ook niet zoveel om een string te vervangen door een aangepaste string. Maar bij een redelijk grote functie die steeds 1 output-string aanpaste kostte 't op een gegeven moment 20 minuten om die functie af te ronden. Door een StringBuilder te gebruiken kon ik dat tot 4 seconden terugbrengen... ;)

Edit: O ja, ditzelfde geldt ook voor VB.NET.
Daar heb je helemaal gelijk in. Daarbij is het natuurlijk wel handig om te vertellen dat dit komt omdat string immutable zijn. Elke wijziging die je op een string uitvoert levert dus een nieuwe string op. Dus als je veel operaties op Strings doet moeten er ontzettend veel objecten gealocceerd worden.

Een StringBuilder lost dit probleem op door gebruik te maken van een char buffer waar hij de operaties op uit voert.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • monnick
  • Registratie: December 2005
  • Niet online
Alle drie bedankt voor jullie reacties, ik zal eens gaan zoeken op Stringbuilder. :>
Pagina: 1