1

から までの 26 個の大文字アルファベットのみで構成される 2 文字の文字列があり'A'ます'Z'

「最も高い」使用値を知る方法があります (例: "IJ") {"AB", "AC", "DD", "IH", "IJ"}。「次の」値を取得したいと思います ( "IK"if"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 を渡すことによって Extension でインクリメントを行うことができます。これには、いくつかの検証とリセットが含まれるようになりました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

残念ながら、簡単な方法はなく、うまくいき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

これは、コードが 2 文字のみであり、AZ のみであることを前提としています。

于 2013-10-10T16:29:19.677 に答える