textBox1.Text=textBox1.Text.Replace("a","z") . Το πρόβλημα σου είναι ότι προσπαθείς να το κάνεις γραμμή-γραμμή χωρίς λόγο. Κάπου εκεί θα χάνεις κάποιο assignment και γίνεται το μπέρδεμα.
Ο τρόπος αυτός πάντως τρώει πολύ μνήμη. Όπως είπε και ο Παναγιώτης (Κεφαλίδης) κάθε κλήση της Replace επιστρέφει ένα νέο string. Αντί γι αυτό καλύτερα να χρησιμοποιήσεις ένα StringBuilder, να διαβάσεις ένα-ένα τους χαρακτήρες του string στο textbox, να κάνεις την αντιστροφή και να προσθέσεις τον αντεστραμμένο χαρακτήρα στον StringBuilder. Κάτι σαν
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim input As String = TextBox1.Text
Dim sb As New StringBuilder(input.Length)
For Each c As Char In input
sb.Append(Invert(c))
Next
TextBox1.Text = sb.ToString()
End Sub
όπου Invert ένα ξεχωριστό function που έφτιαξα για να μην μπλεχτεί ο κώδικας του Button1_Click με αυτό του Invert και δεν βγαίνει άκρη. Επειδή μάλιστα είμαι τεμπέλης και δεν θέλω να γράφω switch για 25 χαρακτήρες φτιάχνω ένα πίνακα με τις τιμές που θέλω να επιστρέψω, αντεστραμένες:
Imports System.Text
Public Class Form1
Dim lookup As New List(Of Char)
Dim base As Int16 = AscW("A")
Public Sub New()
MyBase.New()
InitializeComponent()
For charIdx = AscW("A") To AscW("z")
lookup.Add(ChrW(charIdx))
Next
lookup.Reverse()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim input As String = TextBox1.Text
Dim sb As New StringBuilder(input.Length)
For Each c As Char In input
sb.Append(Invert(c))
Next
TextBox1.Text = sb.ToString()
End Sub
Private Function Invert(ByVal c As Char) As Char
Dim charIdx As Int16 = AscW(c)
If (charIdx < base Or charIdx - base > lookup.Count - 1) Then
Return c
End If
Return lookup(charIdx - base)
End Function
End Class
Το μόνο "περίεργο" είναι ότι η αντιστροφή περιλαμβάνει κεφαλαία και μικρά. Έτσι το αντίστροφο του "a" είναι το "Z". Ακόμα καλύτερα, μπορώ να εκμεταλλευτώ το γεγονός ότι οι χαρακτήρες έρχονται ο ένας μετά τον άλλο και να κάνω την Invert:
Dim start As Int16 = AscW("A")
Dim finish As Int16 = AscW("z")
Private Function Invert(ByVal c As Char) As Char
Dim charIdx As Int16 = AscW(c)
If (charIdx < start Or charIdx > finish) Then
Return c
End If
Return ChrW(finish - (charIdx - start))
End Function
Έτσι γλυτώνω και τον πίνακα.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos