【问题标题】:How to divide a string into multiple strings and reconstruct it back? [closed]如何将一个字符串分成多个字符串并重新构造回来? [关闭]
【发布时间】:2013-01-31 14:03:58
【问题描述】:

我有一个包含多个字符的字符串,例如"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)分成相等的部分,它可以工作,但我不能对每个子字符串做任何事情。

谢谢!

【问题讨论】:

  • StackOverflow 不是代码编写服务。请阅读guide to asking a good question 并显示what you have tried
  • 您在任务的哪一部分遇到了问题?你熟悉ForString.SubStringString.Join吗?
  • 答案似乎如此明显,以至于我很想回答,但这正是您至少应该尝试的原因。

标签: vb.net string split


【解决方案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 创建一个新的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))))

结果:

【讨论】:

  • 但是我怎样才能对每个子字符串做一些事情(例如在第一个字符串中添加数字 1,然后在第二个字符串中添加 2 等等)?
  • @SamuelMedhat:相应地编辑了我的答案。在每个字符串的前面添加了数字(用圆括号括起来)。
  • 可以给我你的邮箱以便我们更好地沟通吗?
【解决方案2】:
  1. 将字符串的长度除以 2(如果有余数,记得 +1)
  2. 了解迭代
  3. 了解 SubString()

【讨论】:

    【解决方案3】:

    扩展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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2020-12-11
      • 2012-02-02
      相关资源
      最近更新 更多