我有一个2个字符的字符串,仅由26个大写字母组成,'A'
到'Z'
。
我们有办法知道“最高”的使用价值("IJ"
中的e..g {"AB", "AC", "DD", "IH", "IJ"}
)。我们希望得到“下一个”值("IK"
如果"IJ"
是“最高”)。
Function GetNextValue(input As String) As String
Dim first = input(0)
Dim last = input(1)
If last = "Z"c Then
If first = "Z"c Then Return Nothing
last = "A"c
first++
Else
last++
EndIf
Return first & last
End Function
显然char++
在VB.NET中不是有效的语法。 C#apparently允许您这样做。是否有一些更短比这更难看的东西会增加一个字母? (注意:Option Strict
已开启)
CChar(CInt(char)+1).ToString
编辑:如评论/答案中所述,上述行甚至不会编译。你无法转换为Char - >在VB.NET中完全整数。
答案 0 :(得分:8)
到目前为止最简单的是:
Dim a As Char = "a"
a = Chr(Asc(a) + 1)
这仍然需要处理"z"
边界条件,具体取决于您需要的行为。
有趣的是,将char++
转换为developerfusion表明char += 1
应该有效。它没有。 (VB.Net似乎没有像C#那样隐式地从char转换为int16。)
为了让事情变得非常好,你可以通过传递char byref来扩展。现在,这包括一些验证以及重置为a
:
<Extension>
Public Sub Inc(ByRef c As Char)
'Remember if input is uppercase for later
Dim isUpper = Char.IsUpper(c)
'Work in lower case for ease
c = Char.ToLower(c)
'Check input range
If c < "a" Or c > "z" Then Throw New ArgumentOutOfRangeException
'Do the increment
c = Chr(Asc(c) + 1)
'Check not left alphabet
If c > "z" Then c = "a"
'Check if input was upper case
If isUpper Then c = Char.ToUpper(c)
End Sub
然后你只需要打电话:
Dim a As Char = "a"
a.Inc() 'a is now = "b"
答案 1 :(得分:1)
不幸的是,没有简单的方法 - 即使CChar(CInt(char)+1).ToString
也行不通。这甚至更加丑陋:
CChar(Char.ConvertFromUtf32(Char.ConvertToUtf32(myCharacter, 0) + 1))
但当然你总是把它放在一个短名称的函数中,或者像Jon E.指出的那样,是一种扩展方法。
答案 2 :(得分:1)
我的回答最多可支持10个字符,但可以轻松支持更多字符。
Private Sub Test
MsgBox(ConvertBase10ToBase26(ConvertBase26ToBase10("AA") + 1))
End Sub
Public Function ConvertBase10ToBase26(ToConvert As Integer) As String
Dim pos As Integer = 0
ConvertBase10ToBase26 = ""
For pos = 10 To 0 Step -1
If ToConvert >= (26 ^ pos) Then
ConvertBase10ToBase26 += Chr((ToConvert \ (26 ^ pos)) + 64)
ToConvert -= (26 ^ pos)
End If
Next
End Function
Public Function ConvertBase26ToBase10(ToConvert As String) As Integer
Dim pos As Integer = 0
ConvertBase26ToBase10 = 0
For pos = 0 To ToConvert.Length - 1
ConvertBase26ToBase10 += (Asc(ToConvert.Substring(pos, 1)) - 64) * (26 ^ pos)
Next
End Function
答案 3 :(得分:0)
试试这个
Private Function IncBy1(input As String) As String
Static ltrs As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim first As Integer = ltrs.IndexOf(input(0))
Dim last As Integer = ltrs.IndexOf(input(1))
last += 1
If last = ltrs.Length Then
last = 0
first += 1
End If
If first = ltrs.Length Then Return Nothing
Return ltrs(first) & ltrs(last)
End Function
这假设代码只有两个字符,而且只是A-Z。