2013-01-31 97 views
-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)到它的工作相等的部分,但我不能做任何事情在每个子字符串上。

谢谢!如果你想有一个三个字母的字来代替,改变x.Index/2x.Index/3

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

StackOverflow不是一个代码写入服务。请阅读[提问一个好问题的指南](http://tinyurl.com/so-hints)并显示[你尝试过的](http://whatyouhavetried.com)。 –

+2

你遇到什么困难?你熟悉'For','String.SubString'和'String.Join'吗? –

+0

答案似乎非常明显,我很想回答,但那就是为什么你至少应该尝试。 – Jodrell

回答

1

您可以在索引使用GroupBy

在这里,结果在调试器(ideone不与VB很好地工作)

enter image description here

但如何我可以做一些在每个子(例如 将在1号的第一个然后2在第二个字符串,所以 )?

我假设你不熟悉Linq。您可以使用一个简单的For Each来枚举查询,您可以将它实现为集合类型f.e.通过使用ToList创建新的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)))) 

结果:

enter image description here

+0

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

+0

@SamuelMedhat:据此编辑我的答案。在每个字符串的前面添加了数字(用圆括号包裹)。 –

+0

我可以收到您的电子邮件,以便我们可以更好地沟通吗? –

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#这样读取整个字符串之前,你可以开始yeilding结果。

一个很好的例子是hosted here

0
  1. 除以2的字符串的长度(记得1,如果有一个余数)
  2. 了解迭代
  3. 了解SUBSTRING()
相关问题