1

我有这个代码:

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 将空格/s 添加到 sb 变量。

所以最终textBox2内容将textBox1与单词之间的空格数相同。

现在textBox2看起来像一长串单词,它们之间没有任何空格。

我的问题是如何在单词之间添加相同的空格textBox1

4

4 回答 4

3

我稍微简化了您的代码,但您应该会发现它很容易在您的情况下应用。问题来自这样一个事实,即您在进行拆分时丢失了空格并且它们没有被重新添加。解决方案是在完成字符串集合时使用“String.Join”。在这种情况下,由于您知道输出大小与输入大小相同,因此我认为没有任何理由使用 stringbuilder。只需使用您输入的大小的数组即可。

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);
于 2013-07-03T06:49:28.973 回答
1

这句话绝对没用:

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+)")用保留空格分割输入字符串。

于 2013-07-03T06:43:57.787 回答
1

这是简单的形式

string text=mytextbox.Text;
while(text.Contains("  ")) //while two spaces
  text=text.Replace("  "," "); //remove two spaces
于 2013-07-03T06:49:56.150 回答
1

如果我做对了,那么您的问题是在当时打乱的单词之间保留确切的空格数。

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);
于 2013-07-03T06:51:44.533 回答