Как вы можете сохранить escape-символы при добавлении строки к объекту StringBuilder?

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

Например, скажем, пользователь вводит следующее:

Hello,

My name is Tom.

Когда я вытаскиваю эту строку из элемента управления текстовым полем и передаю ее моему методу, который содержит StringBuilder, это выглядит так:

Hello,\r\nMy name is Tom. 

Но как только я добавляю его в StringBuilder, он удаляет все escape-символы и становится таким:

Hello,My name is Tom. 

Это приводит к тому, что вывод будет:

Hello,My name is Tom

вместо:

Hello,

My name is Tom

Это метод, который извлекает пользовательский ввод из Ctrl

protected List<BetweenTagData> BetweenTagDataPull(string ctrlName)
{
    List<BetweenTagData> data = new List<BetweenTagData>();
    BetweenTagData pullIt = new BetweenTagData();

    if (ctrlName == "Label")
    {
        pullIt.text = TagLabelTxtbxEnterText.Text.ToString();
        data.Add(pullIt);
    }

    return data;
}

Это метод, который строит строку с помощью StringBuilder.

static public string TagBetween(List<BetweenTagData> betweenData)
{
    StringBuilder betweenString = new StringBuilder();
    foreach (BetweenTagData row in betweenData.ToList())
    {
        if (row.text != "")
        {
            betweenString.Append(row.text);
        }
    }

    return betweenString.ToString();
}

Проблема не в StringBuilder. В какой момент кода вы определили, что CRLF был удален?

Jasen 22.01.2019 19:09

@Jasen Если вы будете следовать коду строка за строкой, используя точку останова, это покажет, что row.fontSize имеет правильную строку. как только он добавляется к построителю строк, строка изменяется, а escape-символы удаляются.

Sentius 22.01.2019 19:18

Я запустил отладчик на .Append(), и в моем простом тесте он сохраняет "\r\n" после .ToString().

Jasen 22.01.2019 19:20

@Jasen Клянусь, моя голова иногда наполняется воздухом. Я разместил неправильные методы. вздох. Я обновил свой пост. Прости. В настоящее время я отлаживаю указанный код, и поэтому мои мозги дислектичны.

Sentius 22.01.2019 19:25

Почему вы звоните ToList(), когда вы уже есть список, и ToString(), когда вы уже есть строка?

Joel Coehoorn 22.01.2019 21:51

@JoelCoehoorn The ToList() был попыткой увидеть, не сошел ли компилятор с ума (мой профессор колледжа назвал это FM F ***ing Magic). Что касается ToString(), это необходимо, так как мой метод возвращает строку, а не StringBuilder. Если вы напишите код в VS, вы увидите красные линии и именно это и говорит.

Sentius 22.01.2019 22:46

Не тот ToString(). Этот: TagLabelTxtbxEnterText.Text.ToString()

Joel Coehoorn 23.01.2019 00:47

@JoelCoehoorn был сделан по той же причине. Во всяком случае, я исправил это. Прокомментировал ниже.

Sentius 24.01.2019 19:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
662
1

Ответы 1

Я не уверен, в чем именно заключается ваша проблема, но я могу с уверенностью сказать, что типы StringBuilder не заботятся об этих символах и не изменяют их. Настоящая проблема скорее в классе BetweenTagData. Я также могу помочь вам улучшить существующие методы:

protected List<BetweenTagData> BetweenTagDataPull(string ctrlName)
{
    List<BetweenTagData> data = new List<BetweenTagData>();

    if (ctrlName == "Label")
    {
        data.Add(new BetweenTagData() {text = TagLabelTxtbxEnterText.Text});
    }

    return data;
}

static public string TagBetween(IEnumerable<BetweenTagData> betweenData)
{
    return string.Join("", betweenData.Where(bd => !string.IsNullOrEmpty(bd.text)).Select(bd => bd.text));
}

Мой класс BetweenTagData буквально просто имеет публичный текст строки {get; набор; } прямо сейчас. Мне нужно, чтобы этот шаг работал, прежде чем я начну над ним работать.

Sentius 22.01.2019 22:55

Вы правы, что проблема была где-то еще в коде, но не в классе. В отладчике он показал строку без escape-символов, когда-то добавленную к StringBuilder, до сих пор не знаю почему, поэтому я подумал, что проблема в этом. На самом деле это была неуместная строка кода в цикле другого метода, который манипулирует той же строкой. Спасибо, что натолкнули меня на мысль поискать в другом месте. Просто казалось, что проблема в этом, потому что снова в отладчике отображалась строка без escape-символов.

Sentius 23.01.2019 00:29

Другие вопросы по теме