1

アルゴリズムをループする VB.net で関数を作成しようとしています。Split コマンドを使用してアルゴリズムを配列に分割したので、値を含む配列ができました。次に、それらをループして、必要に応じて # を「Number」に置き換えようとしますが、VB.net はエラーをスローします。私はVB.netにかなり慣れていないので、なぜこれをしているのかわかりません。アルゴリズムは次の形式ですA B C D E F 1 2 3 #

Function generate(ByVal alg As String)
    Dim algSplit As String() = alg.Split(" ")
    For Each digit In algSplit
        Dim replacement As String = algSplit(digit).Replace("#", "Number")
        algSplit(digit) = replacement
    Next
    Dim result As String = String.Join("", algSplit)
    MsgBox(result)
End Function

クイックフィックスはありますか?

質問パート 2: ループが機能しました。しかし、私が目指していた機能の一部を壊してしまいました。

Public Function GetRandom(ByVal Min As Integer, ByVal Max As Integer) As Integer
    Dim Generator As System.Random = New System.Random()
    Return Generator.Next(Min, Max)
End Function
Public Function RandLet() As String
    Dim number As Integer = GetRandom(1, 26)
    Dim Alphabet() As String = New String() {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V""W", "X", "Y", "Z"}
    Dim Letter As String = Alphabet(number)
    Return Letter
End Function
Function generate(ByVal alg As String) As String
    Dim algSplit As String() = alg.Split(" "c)

    For index As Int32 = 0 To algSplit.Length - 1
        algSplit(index) = algSplit(index).Replace("#"c, GetRandom(1, 9)).Replace("%"c, RandLet())
    Next
    Dim result As String = String.Join("", algSplit)
    MsgBox(result)
    Return result
End Function

最終的な結果は次のA B C D E F 1 2 3 | L % % % | N # # #ようになりますABCDEF123|LXXX|N888 。基本的に、各 # と各 % は、毎回異なる番号ではなく同じ番号に置き換えられます。ループに陥っていればこんなことにはならないと思っていたのですが、何を見逃したのでしょうか?

4

4 に答える 4

2

digitは文字列である「A」を見つけるため、文字列変数を使用して For-Eaching を行っていますが、それをインデックスとして使用しています: algSplit(digit).

代わりにこれを試すことができます:

For i As Integer = 0 To algSplit.Length - 1
  algSplit(i) = algSplit(i).Replace("#", "Number")
Next

と空のスペースを置き換えるだけの場合は#、これも機能します。

alg = alg.Replace(" ", String.Empty).Replace("#", "Number")
于 2012-06-01T12:00:08.380 に答える
1

おそらくLINQを使用すると簡単です:

Dim value = "A B C D E F 1 2 3 #"
Dim replaced = From digit In value.Split(" "c)
             Select digit.Replace("#"c, "Number")
Dim result = String.Join("", replaced)

あなたの「伝統的な」アプローチ、修正:

Function generate(ByVal alg As String) As String
    Dim algSplit As String() = alg.Split(" "c)

    For index As Int32 = 0 To algSplit.Length - 1
        algSplit(index) = algSplit(index).Replace("#"c, "Number")
    Next
    Dim result As String = String.Join("", algSplit)
    Return result
End Function
  1. メソッド (VB の関数) は何かを返す必要があります。関数は何も返さないためAS String、最後に追加します。
  2. Splitいくつかのオーバーロードがあります。使用しているものCharは文字列の代わりに取るので、に置き換えalg.Split(" ")ますalg.Split(" "c)
  3. 配列の値を別のものに置き換えたい場合は、インデックスを頻繁に使用する必要があるため、 aFor-Loopではなく aを使用することをお勧めします (上記を参照)。For-Each
于 2012-06-01T12:00:32.057 に答える
1

文字列の配列をループしています。
algSplit の foreach は、整数ではなく文字列を返します。その文字列を配列のインデックスとして
使用することはできませんdigit

コードを次のように置き換えます。

Function generate(ByVal alg As String)     
    Dim algSplit As String() = alg.Split(" ")     
    For digit = 0 to algSplit.Length - 1
        Dim replacement As String = algSplit(digit).Replace("#", "Number")         
        algSplit(digit) = replacement     
               ' could be simply written as 
               ' algSplit(digit) = algSplit(digit).Replace("#", "Number")     

    Next     
    Dim result As String = String.Join("", algSplit)     
    ??? .. you should return something here ????
End Function 
于 2012-06-01T12:00:43.607 に答える