Sie könnten ein schreiben, dass als eine Art permute, die jeden char-Index abbildet an einen neuen Ort im Bereich [0, textLength[
Um das zu tun, dass Sie einen benutzerdefinierten Modul als Mod
schreiben müssen würden Operator ist mehr ein Rest als ein Modul (aus einem mathematischen Blickwinkel, in Bezug darauf, wie negativ behandelt werden)
Damit müssen Sie nur Ihre String-Indizes durchlaufen und jedes auf seine "Offset" -Modulo die Länge zuordnen des Textes
' Can be made local to Shift method if needed
Function Modulus(dividend As Integer, divisor As Integer) As Integer
dividend = dividend Mod divisor
Return If(dividend < 0, dividend + divisor, dividend)
End Function
Function Shift(text As String, offset As Integer) As String
' validation omitted
Dim length = text.Length
Dim arr(length - 1) As Char
For i = 0 To length - 1
arr(Modulus(i + offset, length) Mod length) = text(i)
Next
Return new String(arr)
End Function
Auf diese Weise können Sie problemlos negative Werte oder Werte verarbeiten, die größer als die Länge des Textes sind.
Hinweis, das Gleiche ist mit einem StringBuilder
anstelle eines Arrays möglich; Ich bin mir nicht sicher, welcher ist "besser"
Function Shift(text As String, offset As Integer) As String
Dim builder As New StringBuilder(text)
Dim length = text.Length
For i = 0 To length - 1
builder(Modulus(i + offset, length) Mod length) = text(i)
Next
Return builder.ToString
End Function
Was soll passieren, wenn der Betrag, wenn mehr als die Länge des Textes? – Sehnsucht