Подтвердить что ты не робот

Многострочное форматирование для стенографических строк в С# (префикс с @)

Мне нравится использовать @ "строки" в С#, особенно когда у меня много многострочного текста. Единственное досаду заключается в том, что мое форматирование кода идет на doodie, когда это делается, потому что вторая и большая строки полностью сдвинуты влево, вместо того, чтобы использовать отступы моего красиво отформатированного кода. Я знаю, что это по дизайну, но есть ли какой-то вариант/взломать способ, чтобы эти строки были отступом, без добавления фактических вкладок/пробелов в выход?

пример добавления:

        var MyString = @" this is 
a multi-line string
in c#.";

Объявление переменной имеет отступы к "правильной" глубине, но вторая и дальнейшая строки в строке попадают в левое поле, поэтому код является довольно уродливым. Вы можете добавить вкладки к началу строк 2 и 3, но сама строка будет содержать эти вкладки... смысл?

4b9b3361

Ответ 1

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

using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    public static class StringExtensions
    {
        public static string StripLeadingWhitespace(this string s)
        {
            Regex r = new Regex(@"^\s+", RegexOptions.Multiline);
            return r.Replace(s, string.Empty);
        }
    }
}

И пример консольной программы:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string x = @"This is a test
                of the emergency
                broadcasting system.";

            Console.WriteLine(x);

            Console.WriteLine();
            Console.WriteLine("---");
            Console.WriteLine();

            Console.WriteLine(x.StripLeadingWhitespace());

            Console.ReadKey();
        }
    }
}

И вывод:

This is a test
                of the emergency
                broadcasting system.

---

This is a test
of the emergency
broadcasting system.

И более чистый способ использовать его, если вы решите пойти по этому маршруту:

string x = @"This is a test
    of the emergency
    broadcasting system.".StripLeadingWhitespace();
// consider renaming extension to say TrimIndent() or similar if used this way

Ответ 2

Кимен дал правильное решение. Я использую аналогичный подход, полученный из метода Scala stripMargin(). Вот как выглядит мой метод расширения:

public static string StripMargin(this string s)
{
    return Regex.Replace(s, @"[ \t]+\|", string.Empty);
}

Использование:

var mystring = @"
        |SELECT 
        |    *
        |FROM
        |    SomeTable
        |WHERE
        |    SomeColumn IS NOT NULL"
    .StripMargin();

Результат:

SELECT 
    *
FROM
    SomeTable
WHERE
    SomeColumn IS NOT NULL

Ответ 3

Я не могу придумать ответ, который бы полностью удовлетворял ваш вопрос, однако вы могли бы написать функцию, которая разбивает ведущие пробелы на строки текста, содержащиеся в строке, и вызывает их при каждом создании такой строки.

var myString = TrimLeadingSpacesOfLines(@" this is a 
    a multi-line string
    in c#.");

Да, это взломать, но вы указали свое признание взлома в своем вопросе.