-4

たとえば、いくつかの文字を含む文字列があり、"The quick fox jumped over the lazy dog"それを複数の文字列に分割したい場合、たとえば、それぞれに2文字があり、それらに対して特定の操作を行い、それらを再結合しますたとえば:

String(1) = "Th"
String(2) = "e "
String(3) = "qu"
String(4) = "ic"

等々 ...

また、文字列を 2 文字の等しい文字列に分割できない場合 (たとえば、"Dad" など)、最後の文字列は最後に残った文字で構成されます。次に例を示します。

String(1) = "Da"
String(2) = "d"

変数を生成するために次のコードを試しました。

    Dim String(69) As String

    For i As Integer = 0 To String.Length - 1
        String(i) = "some text"
     Next

と:

 Dim text As String
 For i As Integer = 0 To RichTextBox1.TextLength - 2 Step 2
 text = RichTextBox1.Text.Substring(i, 2)
 Next i

文字列 (richtextbox1.text) を等しい部分に分割することはできましたが、各部分文字列に対して何もできません。

ありがとう!

4

3 に答える 3

1

GroupByインデックスで使用できます:

Dim twoLetterWords = "The quick fox jumped over the lazy dog".
        Select(Function(c, i) New With {.Char = c, .Index = i}).
        GroupBy(Function(x) CInt(Math.Floor(x.Index / 2))).
        Select(Function(g) String.Join("", g.Select(Function(x) x.Char)))

そのため、代わりに 3 文字の単語が必要な場合は、 に変更x.Index / 2x.Index / 3ます。

これがデバッガーの結果です (IDEONE は VB ではうまく動作しません)。

ここに画像の説明を入力

しかし、各部分文字列で何かを行うにはどうすればよいですか (たとえば、最初の文字列に番号 1 を追加し、2 番目の文字列に 2 を追加するなど)。

あなたはLinqに慣れていないと思います。simpleFor Eachを使用してクエリを列挙できます。これを使用してコレクション型 fe に具体化できます。ToListこれにより、 new が作成されますList(Of String)。次に、. を使用して各文字列にアクセスすることもできますFor-Loop。または、最初に番号を追加するようにクエリを書き直すこともできます (推奨):

シーケンス内の文字列の番号 (この場合は 1 ~ 19) を先頭に追加するには、上記のクエリの最後の行を次のように変更します。

Select(Function(g, index) String.Format("({0}) {1}", 
                          index + 1, 
                          String.Join("", g.Select(Function(x) x.Char))))

結果:

ここに画像の説明を入力

于 2013-01-31T14:18:10.403 に答える
0

ティム・シュメルターのすでに良い答えを拡張するには

Imports System.Runtime.CompilerServices

Module SplitTest
    Sub Main()
        For Each pair In "abcdef".Split(2)
            Console.WriteLine(pair)
        Next

        Console.ReadKey
    End Sub

    <Extension()>
    Public Function Split(ByVal source As String, ByVal length As Integer) _
               As IEnumerable(Of String)

        Return source.Select(Function(c, i) New With {c, i}) _
            .GroupBy(Function(t) t.i \ length) _
            .Select(Function(g) String.Concat(g.Select(Function(t) t.c)))
    End Function
End Module

linq を拡張機能にパッケージ化して、このようにテストできます。


使用に関する唯一の問題GroupByは、インデックスが常に増加することを知るほど賢くないことです。これは、結果を得る前に文字列全体を列挙する必要があることを意味します。

VB.netには何もないのでyield return、おそらくあなたができることと同じくらい良いと思います.


文字列が非常に長い場合は、文字列全体が読み取られる前に結果を生成できるように、C# を少し使用することをお勧めします。

良い例がここにホストされています

于 2013-01-31T14:50:27.263 に答える
0
  1. 文字列の長さを 2 で割ります (余りがある場合は +1 を覚えておいてください)。
  2. 反復について学ぶ
  3. SubString() について学ぶ
于 2013-01-31T14:52:43.490 に答える