Отступ строки на 4 пробела (Добавить табуляцию к строке) - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь добавить отступ в строку, по существу добавляя 4 пробела перед каждой строкой в ​​строке. Строка, к которой я хочу добавить отступ, называется StringToIndent.

Public Class ModifyPage
    Private Sub Button_Test_Click(sender As Object, e As RoutedEventArgs) Handles Button_Test.Click
        Dim StringToIndent As String = ("This is the first row
This is the second row
    This is the third and final row in MyString")

        Dim MySecondString As String = "This is a string in one line."
        Dim BothStringsTogether = StringToIndent & Environment.NewLine & MySecondString

        Debug.Write(BothStringsTogether)
    End Sub
End Class

Текущий вывод:

This is the first row
This is the second row
    This is the third and final row in MyString
This is a string in one line.

Я хочу, чтобы окончательный код (с отступом) выводился :

    This is the first row
    This is the second row
        This is the third and final row in MyString
This is a string in one line.

Как этого добиться с помощью кода? Есть ли опция форматирования, которая позволяет мне добавлять отступы? Метод, который не требует от меня l oop через строку и добавления четырех пробелов для каждой строки, был бы предпочтительным.

Редактирование: способ получить ожидаемый результат - заменить новую строку на Новая строка, а затем добавить отступ. Однако должен быть более элегантный способ сделать это?

Код:

        Dim StringToIndent As String = ("This is the first row
This is the second row
    This is the third and final row in MyString")

        Dim indentAmount = 4
        Dim indent = New String(" "c, indentAmount)
        StringToIndent = indent & StringToIndent.Replace(Environment.NewLine, Environment.NewLine & indent)

        Debug.Write(StringToIndent)

Ответы [ 3 ]

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

В C# вы можете пометить строку как буквальный строковый литерал, поставив перед литералом символ @.

В VB. NET у нас нет этой опции. Вместо этого можно было бы создать литерал XML и получить значение. Вот пример:

    Dim input As String = <element>    This is the first row
This is the second row
    This is the third and final row in MyString
This is a string in one line.
                          </element>.Value().ToString()

Debugger.WriteLine(input.ToString())

Если значение не является stati c, например, вы получаете его откуда-то, то вы вынуждены перебирать строку в некоторой форме. Вы можете либо заменить, как в вашем примере, сделать Split and Join (аналогично вашему примеру), либо вам нужно будет выполнить итерацию вручную.

Итерация вручную может выглядеть более элегантно, используя LINQ, но вы ничего от этого не получите.

Суть в том, что если ваша строка имеет статус c, то вы можете использовать приведенный мною пример XML, в противном случае, если строка является динамической c тогда ваше решение совершенно уместно.

ОБНОВЛЕНИЕ Как отметил Эндрю Мортон, многострочные строковые литералы существуют со времени Visual Studio 2017. Следующее будет иметь тот же результат, что и мой XML буквальный пример:

Dim input As String = "    This is the first row
    This is the second row
        This is a string in one line"

Debugger.WriteLine(input)
1 голос
/ 15 апреля 2020

Использование интерполированной строки, указанной $ перед строкой и константами vb.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim s = $"{vbTab}This Is the first row{vbCrLf}{vbTab}This Is the second row{vbCrLf}{vbTab}{vbTab}This Is the third And final row in MyString{vbCrLf}This Is a string in one line."
    Debug.Print(s)
End Sub
1 голос
/ 14 апреля 2020

Может быть что-то вроде:

Dim res as String
Dim parts As String() = StringToIndent.Split(ControlChars.CrLf.ToCharArray)
For Each part As String In parts
    res.Append("    ") & part & vbCrLf
Next
...