将 stringbuilder 行转换为数组然后将其洗牌

turn stringbuilder lines to array then shuffle it

就像我之前的问题 没有人真正用好的真实答案回答它所以我用另一种方式随机化这些行

我想将最终结果放入数组,然后将其打乱,然后再次将其转换为字符串。

   Dim sb As New StringBuilder
       For Each line In texbox1.text.Lines
       sb.AppendLine(line & " CODE-DONE-1")
       sb.AppendLine(line & " CODE-DONE-2")
       sb.AppendLine(line & " CODE-DONE-3")

    Next
textbox2.text = sb.ToString 'Want to randomize Lines Order

我的尝试

    Dim sb As New StringBuilder
    For Each line In texbox1.text.Lines
        sb.AppendLine(line & " CODE-DONE-1")
        sb.AppendLine(line & " CODE-DONE-2")
        sb.AppendLine(line & " CODE-DONE-3")

    Next
    Dim list = New List(Of String) From {sb.ToString}
    Dim rnd As New Random()
    Dim shuffled = list.OrderBy(Function(x) rnd.Next()).ToList()
    TextBox2.Text = shuffled

出现很多错误,我希望你知道我想做什么,我想在 sb.ToString

中随机播放输出行

您在这里使用字符串生成器制造了一个问题。它们用于构建单个字符串。如果需要,您可以 AppendLine ,但所有要做的就是将构建器中的单个现有字符串变成一个 LONGER 字符串,最后带有 CRLF 字符对。在 "a collection of individual strings that you can shuffle around" 的意义上,stringbuilder 中没有 "lines" 这个概念,例如一个 TextBox 的 .Lines 属性(它实际上是一个字符串数组,但是在 single-string-with-CRLF-characters-in-it字符串数组每行一个字符串)

基本上,当您请求文本框的行时,文本框会在 CRLF 上拆分文本,如果您设置它的行,它会加入您将其与 CRLF 一起提供的数组以形成一个长字符串

我建议你扔掉 stringbuilder 并只是随机排列文本框中的行:

Dim rnd as New Random
Dim shuffledX = textbox1.Lines.OrderBy(Function(x) rnd.Next()).ToArray()

所有这些“从文本框中取出行,将它们放入构建器中,将构建器串起来(形成一个字符串),将其放入列表中(您的列表中有一个字符串),获取字符串(列表中只有一个)以随机顺序排列....

把它全部扔掉。随机播放 .Lines


如果你读取一个文件来获取你的台词,你有一个台词数组,你可以打乱它!:

Dim x = File.ReadAllLines("path...")

Dim shuffledX = x.OrderBy(...).ToArray()

如果您的用户一次给您一行,请将它们放入一个列表(字符串)中并随机播放:

Dim x as New List(Of String)
x.Add(Console.ReadLine())
x.Add(Console.ReadLine())
x.Add(Console.ReadLine())
x.Add(Console.ReadLine())
x.Add(Console.ReadLine())

Dim shuffledX = x.OrderBy(...).ToArray()

如果您确实从某处获取字符串或字符串生成器,则在 CRLF 上拆分它:

Dim s = $"My{Environment.NewLine}string{Environment.NewLine}with{Environment.NewLine}lines"
Dim x = s.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)

Dim shuffledX = a.OrderBy(...).ToArray()

一旦你打乱了你的台词

如果你想把它们放到一个文本框里,而且它们是一个数组,你可以将它们分配给文本框行 属性:

textbox2.Lines = shuffledX

如果要将它们写入文件,请写入数组:

File.WriteAllLines(...)

如果您想将它们发送到控制台:

For Each s in shuffledX
  Console.WriteLine(s)
Next s

如果您需要将它们作为字符串,单个字符串,然后将数组连接成单个字符串:

Dim s = string.Join(Environment.NewLine, shuffledX)

你可以设置一个textbox.Text = s,或者把它放在一个stringbuilder(For Each t in s sb.AppendLine(t),或者写一个文件(File.WriteAllText("path", s)),把它转储到控制台(Console.Write(s) )...


总而言之,您必须清楚什么是字符串构建器,什么不是字符串生成器,什么是字符串,什么不是字符串,什么是字符串数组is/isn。您必须为任务使用最合适的数据存储;如果一个数组进来,洗牌数组。如果传入单个字符串,请将其拆分为一个数组并打乱数组。不要将数组放入 stringbuilder 并要求我们帮助改组 stringbuilder - 这太疯狂了,你唯一能做的就是通过 stringBuilder.ToString().Split() 撤消错误的步骤(放入 stringbuilder)到撤消首先将数组放入 stringbuilder 的错误步骤 - 将 stringbuilder 转换为字符串,然后拆分字符串返回到可以随机播放的数组。

重述@Calus Jard 和 JQSOFT 的答案。

1.Declare 表单级别的随机变量 class

2.Declare 列表(T)

3.Add 将您的台词添加到列表中。

4.Shuffle 包含 OrderBy 的列表并在 TextBox2 中显示

Private rand As New Random
Private Sub OPCode()
    Dim lst As New List(Of String)
    For Each line In TextBox1.Lines
        lst.Add(line & " CODE-DONE-1")
        lst.Add(line & " CODE-DONE-2")
        lst.Add(line & " CODE-DONE-3")
    Next
    TextBox2.Lines = lst.OrderBy(Function(x) rand.Next).ToArray
End Sub

归功于 JQSoft 和 Calus。这只是一个回顾。