我有一个字符串,其中包含多个字符,例如"The quick fox jumped over the lazy dog"
,我想将它分成多个字符串,例如,每个字符串都有两个字符,然后我会对它们执行某个操作,而我我会重新加入他们,例如:
String(1) = "Th"
String(2) = "e "
String(3) = "qu"
String(4) = "ic"
等等......
如果字符串不能被分成两个字符的相等字符串(例如“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
将sting(richtextbox1.text)划分为相同的部分,但是我无法对每个子字符串做任何事情。
谢谢!
答案 0 :(得分: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 / 2
更改为x.Index / 3
。
这里是调试器中的结果(ideone与VB不兼容)
但是我怎样才能在每个子串上做一些事情(例如 在第一个字符串中添加数字1,然后在第二个字符串中添加2,所以 在)?
我认为你不熟悉Linq。您可以使用简单的For Each
来枚举查询,您可以将其实现为集合类型,f.e。使用创建新ToList
的{{1}}。然后,您还可以使用List(Of String)
访问每个字符串。或者您可以重写查询以首先添加您的号码(推荐):
要在前面添加序列中的字符串编号(本例中为1-19),请将上面查询的最后一行更改为:
For-Loop
结果:
答案 1 :(得分:0)
扩展Tim Schmelter's already good answer
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#,这样您就可以在读取整个字符串之前开始构建结果。
一个很好的例子是hosted here
答案 2 :(得分:0)