C # Вставить многострочный текст в строку в определенной позиции

У меня есть многострочная строка, в которую я хочу добавить многострочный текст и сохранить отступ для добавленных строк текста. Пример, вероятно, лучше объясняет проблему:

StringBuilder sb = new StringBuilder();
int int1 = 50000;
double double1 = 5800.0;
string test = "Test\r\nSome\r\nMultiline\r\nstuff.";
sb.AppendFormat("{0,8};{1,8};{2}",int1,double1,test);
Console.Write(sb.ToString());

Это даст мне результат

50000;    5800;Test
Some
Multiline
stuff.

Однако я хочу достичь

50000;    5800;Test
               Some
               Multiline
               stuff.

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


person Nicolai Esbensen    schedule 30.09.2015    source источник
comment
Используйте String.Replace на \r\n, чтобы добавить пробелы? Нравится test.Replace("\r\n", " \r\n";? То есть, добавьте 16 пробелов перед новой строкой (в комментариях выглядит неправильно в отформатированном виде).   -  person Tim    schedule 30.09.2015
comment
Да нет, тебе придется сделать это самому.   -  person    schedule 30.09.2015
comment
@Will вы все равно можете сделать это самостоятельно с помощью IndentedTextWriter (msdn.microsoft.com/en-us/library/)   -  person BitTickler    schedule 01.10.2015


Ответы (3)


Вы можете использовать System.CodeDom.Compiler.IndentedTextWriter для простого решения. В любом случае стоит знать этот тип, если вам нужно часто генерировать исходный код или что-то подобное.

В конце концов, это также System.Text.StringBuilder, который используется, как показывает демонстрационный код:

static void Bar()
{
    int int1 = 50000;
    double double1 = 5800.0;
    string test = "Test\r\nSome\r\nMultiline\r\nstuff.";

    StringBuilder sb = new StringBuilder();
    StringWriter writer = new StringWriter(sb);
    IndentedTextWriter itw = new IndentedTextWriter(writer, new string(' ', 18));
    itw.Write("{0,8};{1,8};", int1, double1);
    itw.Indent++;
    test.Split(new char[] { '\n' }).All(s => { itw.WriteLine(s); return true; });
    Console.Write(sb.ToString());
}
person BitTickler    schedule 30.09.2015

Как сказано в комментариях, вам в основном придется написать свой собственный. Хотя это не так много кода:

        var sb = new StringBuilder();
        int int1 = 50000;
        double double1 = 5800.0;
        sb.AppendFormat("{0,8};{1,8};");
        var indentation = "".PadLeft(sb.Length);
        var test = "Test\r\nSome\r\nMultiline\r\nstuff.";
        var testLines = test.Split(new[] { "\r\n" }, StringSplitOptions.None);
        for (int i=0; i<testLines.Length;i++)
        {
            if (i > 0)
            {
                sb.AppendFormat("{0}{1}", "\r\n", indentation);
            }
            sb.Append(testLines[i]);
        }
        return sb.ToString();

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

person smelch    schedule 30.09.2015

код:

Console.WriteLine("-------------------------------");
Console.WriteLine("First Name | Last Name  |   Age");
Console.WriteLine("-------------------------------");
Console.WriteLine(String.Format("{0,-10} | {1,-10} | {2,5}", "Bill", "Gates", 51));
Console.WriteLine(String.Format("{0,-10} | {1,-10} | {2,5}", "Edna", "Parker", 114));
Console.WriteLine(String.Format("{0,-10} | {1,-10} | {2,5}", "Johnny", "Depp", 44));
Console.WriteLine("-------------------------------");

выход:

-------------------------------
First Name | Last Name  |   Age
-------------------------------
Bill       | Gates      |    51
Edna       | Parker     |   114
Johnny     | Depp       |    44
-------------------------------

источник:

http://www.csharp-examples.net/align-string-with-spaces/

person joelnet    schedule 30.09.2015