Вопрос:
У меня есть этот код:
private void BtnScrambleText_Click(object sender, EventArgs e) { textBox1.Enabled = false; BtnScrambleText.Enabled = false; StringBuilder sb = new StringBuilder(); var words = textBox1.Text.Split(new char[] { ‘ ‘ }); for (int i = 0; i < words.Length; i++) { if (string.IsNullOrEmpty(words[i])) { sb.Append(words[i]); } else { ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(words[i]); scrmbltb.GetText(); sb.Append(scrmbltb.scrambledWord); } } textBox2.AppendText(sb.ToString()); }
Например, в textBox1 я набрал клавишу пробела 7 раз, а затем набрал несколько слов, а затем снова 5 пробелов и слово:
danny hi hello daniel hello
Так что давайте скажем, что danny находится после 7 пробелов с начала в textBox1 а между daniel и hello – более 5 пробелов.
В моем коде я сделал:
if (string.IsNullOrEmpty(words[i])) { sb.Append(words[i]); }
Но этого никогда не произойдет, и это не так. Я хотел проверить, что если до или после слова в текстовом поле есть какое-либо пространство/с, добавьте пробел /s в переменную sb.
Таким textBox2 содержимое textBox2 в конце будет таким же, как в textBox1 с таким же количеством пробелов между словами.
Теперь textBox2 выглядит как длинная строка слов без пробелов между ними.
Моя проблема заключается в том, как добавить те же пробелы между словами из textBox1?
Лучший ответ:
Это утверждение абсолютно бесполезно:
if (string.IsNullOrEmpty(words[i])) { sb.Append(words[i]); }
Кажется, вам нужно что-то вроде этого (не тестировалось):
private void BtnScrambleText_Click(object sender, EventArgs e) { textBox1.Enabled = false; BtnScrambleText.Enabled = false; StringBuilder sb = new StringBuilder(); var words = Regex.Split(textBox1.Text, @»(?=(?<=[^s])s+)»); foreach (string word in words) { ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(word.Trim()); scrmbltb.GetText(); sb.Append(word.Replace(word.Trim(), scrmbltb.scrambledWord)); } textBox2.AppendText(sb.ToString()); }
Regex.Split(textBox1.Text, @»(?=(?<=[^s])s+)») разделяет входную строку с сохранением пробелов.
Ответ №1
Я немного упростил ваш код, но вы должны легко его применять в своей ситуации. Проблема возникает из-за того, что вы теряете пространство, когда вы делаете раскол, и они не добавляются обратно. Решение заключается в использовании “String.Join”, когда у вас есть готовая коллекция строк. В этом случае, так как вы знаете, что размер вывода совпадает с размером ввода, я не вижу причин использовать строковый конструктор. Просто используйте массив, который вы производите для ввода.
string inputText = «This is a test»; var words = inputText.Split(new char[] { ‘ ‘ }); var outputWords = new string[words.Length]; for (int i = 0; i < words.Length; i++) { if (string.IsNullOrEmpty(words[i])) { outputWords[i] = words[i]; } else { outputWords[i] = Scramble(words[i]); } } string outputText = string.Join(» «,outputWords); Ответ №2
Это простая форма
string text=mytextbox.Text; while(text.Contains(» «)) //while two spaces text=text.Replace(» «,» «); //remove two spaces Ответ №3
Если я правильно понял, ваша проблема заключается в том, чтобы сохранить точное количество пробелов между тогдашними скремблированными словами.
var words = string.Split(new char[]{‘ ‘}, StringSplitOptions.None); // this keeps the spaces as «epmty words» var scrambled = words.Select(w => { if (String.IsNullOrEmpty(w)) return w; else { ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(w); scrmbltb.GetText(); return scrmbltb.scrambledWord; } }); var result = string.Join(» «, scrambled);