-4

例如,我有一个包含多个字符的字符串,"The quick fox jumped over the lazy dog"我想将其划分为多个字符串,例如每个字符串都有两个字符,然后我将对它们进行特定操作,然后将它们重新加入,例如:

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

等等 ...

如果字符串不能被分成相等的两个字符的字符串(例如“爸爸”),它会使最后一个字符串由最后一个剩余的字母组成,例如:

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)))

因此,如果您想改用三个字母的单词,请更改x.Index / 2x.Index / 3.

这是调试器中的结果(ideone 不适用于 VB)

在此处输入图像描述

但是我怎样才能对每个子字符串做一些事情(例如在第一个字符串中添加数字 1,然后在第二个字符串中添加 2 等等)?

我假设您不熟悉 Linq。您可以使用一个简单For Each的查询来枚举查询,您可以将其具体化为一个集合类型,fe 通过使用ToListwhich 创建一个新的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 回答