Случайный порядок строк в текстовом поле с помощью StringBuilder - PullRequest
2 голосов
/ 21 апреля 2020

Я пытаюсь рандомизировать окончательный результат. Идея состоит в том, чтобы получить строки текстового поля, сделать некоторый код, затем экспортировать его в textbox2, код работает, но я хочу рандомизировать порядок строк при экспорте в textbox2

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

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

Пример, если я положил в textbox1

1
2
3

я хочу вывод в textbox2

3 Code-Done-1
1 Code-Done-3
2 Code-Done-2
3 Code-Done-3
1 Code-Done-1
3 Code-Done-2
2 Code-Done-3

1 Ответ

0 голосов
/ 21 апреля 2020

Создание переменной уровня класса типа Random:

Imports System.Linq
'//

Private ReadOnly rand As New Random
'//

Использование StringBuilder с For..Loop способом:

Dim sb As New StringBuilder

For Each line In TextBox1.Lines.
    Where(Function(x) Not String.IsNullOrWhiteSpace(x)).
    OrderBy(Function(x) rand.Next)
    sb.AppendLine($"{line} Code-Done")
Next

TextBox2.Text = sb.ToString

Часть OrderBy(Function(x) rand.Next) будет перетасовывать строки первого текстового поля и отобразите их во втором ..

В качестве альтернативы, вы можете использовать методы расширения для достижения этой цели в одной строке:

TextBox2.Lines = TextBox1.Lines.
    Where(Function(x) Not String.IsNullOrWhiteSpace(x)).
    OrderBy(Function(x) rand.Next).
    Select(Function(x) $"{x} Code-Done").ToArray

Так что выберите подходящий способ для вас.


В соответствии с вашими правками, если вы хотите добавить выходных данных, замените StringBuilder на переменную уровня класса типа List(Of String) и отредактируйте код следующим образом:

Imports System.Linq
'//

Private ReadOnly rand As New Random
Private ReadOnly output As New List(Of String)

'//

For Each line In TextBox1.Lines.
    Where(Function(x) Not String.IsNullOrWhiteSpace(x))
    output.Add($"{line} Code-Done")
Next

TextBox2.Lines = output.OrderBy(Function(x) rand.Next).ToArray
...