Создать многострочный строковый объект из строкового массива — С#

Я пытаюсь создать многострочную строку из массива строк, например

@"A minErr message has two parts: 
  the message itself and the url that contains the encoded message.
  The message's parameters can contain other error messages which also include error urls.";

и у меня есть строковый массив этих строк

string [] miltilines={"A minErr message has two parts:","the message itself and the url that contains the encoded message.","The message's parameters can contain other error messages which also include error urls."}

Я пробовал несколько подходов для получения многострочного строкового объекта, но закончился \r\n в строковом объекте

1: String.Join(Environment.NewLine, miltilines)

2:

string multiline = @" ";
foreach (var item in miltilines)
            {
                multiline += @"" + item.Trim() + " ";
            }

3:

StringBuilder stringBuilder = new StringBuilder();
 foreach (var item in miltilines)
            {
 stringBuilder.AppendLine(item );
}

Есть ли способ получить многострочный строковый объект из строкового массива


person Muhammad Mansoor    schedule 15.10.2018    source источник
comment
№1 должен был работать нормально. Что заставляет вас думать, что это не так   -  person pm100    schedule 15.10.2018
comment
Я пробовал это и в объекте, который я получаю. Сообщение minErr состоит из двух частей:/r/n само сообщение и URL-адрес, содержащий закодированное сообщение./r/n Параметры сообщения могут содержать другие сообщения об ошибках, которые также включают URL-адреса ошибок. .   -  person Muhammad Mansoor    schedule 15.10.2018
comment
but ended with \r\n in string object так представлен разрыв строки в окнах отладки Visual Studio. Если вы запишете эту строку в файл и откроете его в текстовом редакторе, вы увидите разрыв строки.   -  person Magnetron    schedule 15.10.2018
comment
Тем не менее, либо методы 1, либо 3 должны работать.   -  person Magnetron    schedule 15.10.2018
comment
Да. Трехстрочный строковый объект выглядит как Строка 1\r\nСтрока 2\r\nСтрока 3. Символы \r\n представляют символы конца строки в Windows. Если в массиве больше нескольких строк, вам действительно следует использовать решение StringBuilder.   -  person Flydog57    schedule 15.10.2018
comment
\ запускает управляющую последовательность, вот список. Вы можете использовать их в своей строке, если вы не используете @ перед строкой.   -  person Magnetron    schedule 15.10.2018
comment
Я знаю, что получу это \r\n.. но что, если я хочу, чтобы этот строковый объект был отформатирован, как мы @.. Я использую сторонний инструмент, который обрабатывает строку в этом формате, он дает мне исключение, когда я прохожу \r или \n   -  person Muhammad Mansoor    schedule 15.10.2018
comment
Если сторонний инструмент дает вам исключение, когда строка содержит символ новой строки, вы не можете передать многострочную строку. Многострочная строка по определению содержит \r\n.   -  person Rufus L    schedule 15.10.2018
comment
Мне нужно передать как строковый объект. Я нигде не пишу эти строки, и я не уверен, сколько строк у меня может быть в этом массиве.   -  person Muhammad Mansoor    schedule 15.10.2018
comment
Он работает, когда я передаю жестко закодированный строковый объект с несколькими строками, как в примере   -  person Muhammad Mansoor    schedule 15.10.2018
comment
Строка, сформированная из вашего образца, также содержит \r\n. Вы только что использовали @, чтобы скрыть символы и отобразить отформатированную строку в редакторе. Установите точку останова после этой строки и посмотрите на строку в отладчике.   -  person Rufus L    schedule 15.10.2018
comment
Возможно, вам следует поделиться сообщением об ошибке или трассировкой стека, которые вы получаете от клиента, когда вы передаете строку из # 1 или # 3, или просто сравнить две строки в отладчике, чтобы увидеть, есть ли другие различия.   -  person Rufus L    schedule 15.10.2018
comment
наконец-то я смог получить желаемый результат ... да, вы правы, @ просто скрывает \r\n ... Я передал этот строковый массив в потоковый автор с помощью строки записи, и этот поток был передан третьей стороне, и теперь он работает. .. до того, как это дало мне исключение длины... спасибо всем за вашу любезную помощь   -  person Muhammad Mansoor    schedule 16.10.2018


Ответы (2)


Если вы протестируете исходный код, назначив его переменной:

var value = @"A minErr message has two parts: 
              the message itself and the url that contains the encoded message.
              The message's parameters can contain other error messages which also include error 
              urls.";

Затем перейдите в окно отладчика и проверьте переменную value, вы найдете это:

"A minErr message has two parts: \r\n  the message itself and the url that contains the encoded message.\r\n  The message's parameters can contain other error messages which also include error urls."

\r и \n являются экранирующими последовательностями:

Escape-последовательности обычно используются для указания таких действий, как возврат каретки и перемещение табуляции на терминалах и принтерах. Они также используются для буквального представления непечатаемых символов и символов, которые обычно имеют особое значение, таких как двойные кавычки (").

Подход № 1 должен работать нормально. Environment.NewLine представляет непечатаемые символы:

Строка, содержащая "\r\n" для платформ, отличных от Unix, или строка, содержащая "\n" для платформ Unix.

Таким образом, они не будут печататься как \r или \n, а скорее будут интерпретироваться как операции возврата каретки и перевода строки соответственно.

person JuanR    schedule 15.10.2018

Со строками может быть огромный разрыв между фактическими данными и тем, как они представлены пользователю. В том числе и вы, пользователь отладчика. Если вы не знаете, как интерпретировать строку, вы не сможете получить буквы или даже понять, где заканчивается чертова вещь: https://www.joelonsoftware.com/2003/10/08/the-абсолютно-минимум-каждый-программный-разработчик-абсолютно-положительно-должен-знать-о-юникоде-и-наборах-символов-без-оправданий/

Нередко у отладчика и Windows/программы очень разные представления о том, как следует интерпретировать любую заданную строку. Ваш пример: «Сообщение minErr состоит из двух частей:/r/n само сообщение и URL-адрес, содержащий закодированное сообщение./r/n Параметры сообщения могут содержать другие сообщения об ошибках, которые также включают URL-адреса ошибок». Это всего лишь одна из возможных интерпретаций того, что вы ожидаете от строки.

Отладчик использует всплывающие подсказки. Эти всплывающие подсказки не поддерживают несколько строк. Это может быть вызвано техническими причинами (всплывающие подсказки не поддерживают новые строки/не поддерживали их при первом написании) или причинами использования (это затруднило бы чтение подсказок для строк с большим количеством новых строк).

/r/n — это символы «возврата каретки» и «новой строки» в Windows. Не имея возможности фактически отображать содержимое в несколько строк (например, многострочное текстовое поле), отладчик делает следующую лучшую вещь: он отображает символы новой строки Escape-символы как часть строки. Любой код, который на самом деле может отображать текст в несколько строк, будет правильно интерпретировать эти символы как то, что они должны представлять.

person Christopher    schedule 15.10.2018