StringBuilder.Append помещает текст в новую строку в случае длинной строки C # - PullRequest
0 голосов
/ 10 октября 2019

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

        using (var wr = new StreamWriter(filepath,true))
        {
            var strBuilder = new StringBuilder();
            strBuilder.Append(UtilityBillId);
            strBuilder.Append("|B|");
            strBuilder.Append(billId);
            strBuilder.Append("|B|");
            strBuilder.Append(paymentId);
            strBuilder.Append("|B|");
            strBuilder.Append(stepTitle);
            strBuilder.Append("|B|");
            strBuilder.Append(resultCode);
            strBuilder.Append("|B|");
            strBuilder.Append(resultMessage);
            strBuilder.Append("|B|");
            strBuilder.Append(Common._getCurrentDateTime());


            wr.WriteLine(strBuilder.ToString());
        }

когда resultMessage длинный, какая-то его часть находится в новой строке

хорошо отметить, что когда я использую File.ReadAllLines(path), он показывает тот же результат в текстовом файле.

выможете посмотреть текст результата по ссылке ниже

Результат

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

String Builder не имеет ничего общего с новыми строками, если нет \n или вы добавляете вручную aa System.getProperty("line.separator"). Единственное, что изменяется в зависимости от длины строки, это распределение памяти.

Здесь есть часть документации, объясняющая это:

Свойство StringBuilder.Length указывает количество символов, которое StringBuilderобъект в настоящее время содержит. Если вы добавляете символы в объект StringBuilder, его длина увеличивается до тех пор, пока он не станет равным размеру свойства StringBuilder.Capacity, которое определяет количество символов, которое может содержать объект. Если количество добавленных символов приводит к тому, что длина объекта StringBuilder превышает его текущую емкость, выделяется новая память, значение свойства Capacity удваивается, новые символы добавляются в объект StringBuilder и настраивается его свойство Length. Дополнительная память для объекта StringBuilder выделяется динамически, пока не достигнет значения, определенного свойством StringBuilder.MaxCapacity. При достижении максимальной емкости дальнейшая память не может быть выделена для объекта StringBuilder, и при попытке добавить символы или расширить его за пределы его максимальной емкости выдается либо исключение ArgumentOutOfRangeException, либо исключение OutOfMemoryException.

Для получения дополнительной информации вы можетепроверьте официальный поток Microsoft: https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder?view=netframework-4.8

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

1 голос
/ 10 октября 2019

Этот код создаст файл с одной строкой:

        Regex r = new Regex("[\r\n]");
        var strBuilder = new StringBuilder();
        strBuilder.Append(UtilityBillId);
        strBuilder.Append("|B|");
        strBuilder.Append(billId);
        strBuilder.Append("|B|");
        strBuilder.Append(paymentId);
        strBuilder.Append("|B|");
        strBuilder.Append(r.Replace(stepTitle, ""));
        strBuilder.Append("|B|");
        strBuilder.Append(resultCode);
        strBuilder.Append("|B|");
        strBuilder.Append(r.Replace(resultMessage, ""));
        strBuilder.Append("|B|");
        strBuilder.AppendLine(Common._getCurrentDateTime());

        File.AppendAllText(filepath, strBuilder.ToString());

Я предположил, что все, что заканчивается идентификатором, было int, и я также предполагаю, что в datetime нет новой строки

Протестируйте его и посмотрите, будет ли он «создавать файл с двумя строками» - если это так, я уверен на 100%, что это ваш редактор, переносящий строку.

0 голосов
/ 10 октября 2019

На основании ответа 'Caius Jard' я изменил свой код, и это решило мою проблему.

        Regex r = new Regex("[\r\n]");
        var strBuilder = new StringBuilder();
        strBuilder.Append(UtilityBillId);
        strBuilder.Append("|B|");
        strBuilder.Append(billId);
        strBuilder.Append("|B|");
        strBuilder.Append(paymentId);
        strBuilder.Append("|B|");
        strBuilder.Append(r.Replace(stepTitle, ""));
        strBuilder.Append("|B|");
        strBuilder.Append(resultCode);
        strBuilder.Append("|B|");
        strBuilder.Append(r.Replace(resultMessage, ""));
        strBuilder.Append("|B|");
        strBuilder.AppendLine(Common._getCurrentDateTime());

        wr.WriteLine(strBuilder.ToString());
...