1

我有一个仅由 26 个大写字母组成的 2 个字符串,'A'通过'Z'.

我们有办法知道“最高”使用值(例如"IJ"in {"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#显然允许你这样做。有没有比这更短的东西会增加一个字母?(注:Option Strict已开启)

CChar(CInt(char)+1).ToString

编辑:如评论/答案中所述,上述行甚至无法编译。您根本无法在 VB.NET 中从 Char -> Integer 进行转换。

4

4 回答 4

9

到目前为止最整洁的就是:

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"
于 2013-10-10T16:07:30.803 回答
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
于 2013-10-10T16:27:35.053 回答
1

不幸的是,没有简单的方法——甚至CChar(CInt(char)+1).ToString行不通。更丑的是:

CChar(Char.ConvertFromUtf32(Char.ConvertToUtf32(myCharacter, 0) + 1))

但当然,你总是可以把它放在一个短名称的函数中,或者像 Jon E. 指出的那样,一个扩展方法。

于 2013-10-10T16:15:58.327 回答
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

这确实假设代码只有两个字符,并且只是 AZ。

于 2013-10-10T16:29:19.677 回答