многострочное форматирование для дословных строк в c # (префикс @) - PullRequest
20 голосов
/ 24 августа 2011

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 24 августа 2011

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

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
5 голосов
/ 22 января 2016

Cymen дал правильное решение.Я использую аналогичный подход, полученный из метода 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
2 голосов
/ 24 августа 2011

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

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

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

...