превратить строки строителя в массив, затем перемешать его - PullRequest
0 голосов
/ 21 апреля 2020

как в моем предыдущем вопросе Случайный порядок строк в текстовом поле с помощью StringBuilder никто на самом деле не отвечает на него хорошим реальным ответом, поэтому я рандомизирую строки другим способом

я хочу поместить в массив массив окончательный результат затем перетасуйте, затем снова включите в строку.

   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

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Повторный ответ @Calus Jard и JQSOFT.

1.Объявление переменной на уровне формы для класса Random

2.Объявление списка (Of T)

3.Добавьте свои строки в список.

4. Перетасуйте список с помощью 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. Это просто резюме.

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

Вы создаете проблему с помощью строителя строк. Они для построения одной строки. Вы можете AppendLine, если хотите, но все, что вам нужно сделать, это превратить одну существующую строку в конструкторе в строку LONGER с парой символов CRLF в конце. В строителе строк отсутствует понятие «линии» в смысле «набора отдельных строк, которые можно перемешать», как, например, в свойстве TextBox .Lines (которое на самом деле представляет собой массив строк, но есть шаг преобразования, который идет между одной строкой с CRLF-символами в нем и массивом строк-одной строкой на строку )

В основном текстовое поле разделяет текст на CRLF, когда вы запрашиваете его строки, и если вы устанавливаете его строки, он присоединяется к массиву, который вы даете ему вместе с CRLF, чтобы сделать одну длинную строку

Я рекомендую вам выбросить строителя строк и просто перетасовать строки в текстовом поле:

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

Все это «извлечение строк из текстового поля, помещение их в построитель, разбиение строителя (делает один строка), помещая его в список (ваш список содержит одну строку), получая строки (есть только одна) из списка в случайном порядке ....

Просто выбросьте все это. Перемешать * 101 9 *


Если вы читаете файл, чтобы получить свои строки, у вас есть массив строк, вы можете перемешать его!:

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 или поместить его в строитель строк (For Each t in s sb.AppendLine(t), или записать файл (File.WriteAllText("path", s)), выгрузите его на консоль (Console.Write(s)) ...


При всем этом вы должны четко понимать, что такое строитель строк, а что нет, что за штука ng есть и нет, и что такое массив строк / нет. Вы должны использовать наиболее подходящее хранилище данных для этой задачи; если массив входит, перемешайте массив. Если поступает одна строка, разбейте ее на массив и перемешайте массив. Не берите массив и не помещайте его в строителя строк, а попросите нас помочь перетасовать строителя строк - это безумие, единственное, что вы можете сделать, это отменить неправильный шаг (поместить в построитель строк) с помощью stringBuilder.ToString().Split(), чтобы отменить неправильный шаг при помещении массива в строитель строк - превращение строителя строк в строку и последующее разбиение строки возвращает к массиву, который можно перемешать.

...