あなたがMod
としてカスタム弾性率を記述する必要がありますことを行うためには範囲[0, textLength[
で新しい場所にそれぞれの文字インデックスをマップ並び替えるの一種として、それを書くことができ演算子はモジュラスよりも残っています(負の扱いに関する数学的な観点から)
これで、文字列インデックスをループし、それぞれの値を "offsetted"の値でモジュロにマップする必要があります文章の内容
' 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
このようにして、テキストの長さよりも大きな負の値または値を簡単に処理できます。
配列の代わりにStringBuilder
と同じことが可能であることに注意してください。どちらが「より良い」か分かりません
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
より大きい場合ならば量をどうしますかテキストの長さ? – Sehnsucht