我试图获取textbox.Text中的单词索引并将其添加到textBox2但它不能正常工作

时间:2013-07-04 23:27:43

标签: c# winforms

这是代码:

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[] { ' ', '"', ',', '-', '>', '\r', '\n', ':', '.', '<', '/', '=', '\\' }, StringSplitOptions.RemoveEmptyEntries);
            int index = 0;
            int nextIndex = 0;
            for (int i = 0; i < words.Length; i++)
            {
                string word = words[i];
                int wordWidth = word.Length;
                index = textBox1.Text.IndexOf(word, index);
                string t = textBox1.Text.Substring(nextIndex, index);
                textBox2.AppendText(t);
                string s = textBox1.Text.Substring(index, wordWidth);
                if (index == -1) break;

                if (word.Length > 0)
                {
                    ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(s.Trim());
                    scrmbltb.GetText();
                    sb.Append(word.Replace(s.Trim(), scrmbltb.scrambledWord));
                    textBox2.AppendText(sb.ToString());
                }

            }
        }

我知道还有其他方法,但我想使用indexof和substring。

首先我从textBox中获取所有单词并将它们添加到变量单词中。 然后在循环中首先获取textBox1的内容,直到第一个单词并将其添加到textBox2。

然后我找到第一个单词index然后substring,所以变量s包含单词。 我在争论这个词,然后将这个词添加到textBox2。 这个想法是:

  1. 添加内容直到第一个单词。
  2. 在第一个内容之后添加加扰字。

  3. 要添加上次找到的单词中的下一个内容,直到下一个单词。

  4. 在最后一个位置添加下一个加扰字的最后一个索引。
  5. 依此类推,textBox2中的内容与textBox1中的内容格式相同,但textBox2中的单词将被加扰。

    问题是当我点击按钮时,它会将很多次内容和单词添加到textBox2中,并且会造成很多混乱。

    为什么我该如何解决?

    编辑**

    当输入手动文本到textBox1时,例如:

        ? where am i ? ! hello im here -----
         _______________
    

    几个人的时间是几点? :&gt;

    我开始在几个空格后键入textBox1,然后添加了一些字符 - ? &GT;然后我按了回车键并添加了另一条线。

    textBox2中的结果是:

    wrhee hlelo hree -----          的 _ __ _ ___

    wht tmie evoyrnee

    我需要的词语很好,而且问题在于它没有复制标志?和&gt;并没有复制其他没有被扰乱的内容。单词:是我很少没有复制到textBox2。

    我希望将整个内容复制到带有空格的textBox2以及除了我需要加扰的单词之外的所有内容。

    争夺部分正在运作但内容副本却没有。

1 个答案:

答案 0 :(得分:1)

这两行是罪魁祸首:

string t = textBox1.Text.Substring(nextIndex, index);
textBox2.AppendText(t);

您永远不会将nextIndex设置为任何内容。所以基本上它是一个恒定的零,你在开始时设置它。 Substring(0,index)表示每次将整个内容从零添加到您找到的字词时。它从nextIndex读取index长度,而不是位置index

尝试用以下内容替换这两行:

string t = textBox1.Text.Substring(nextIndex,index-nextIndex);//index-nextIndex is the length
nextIndex = index;
textBox2.AppendText(t);

编辑:所以我实际做了一些测试,并得出了这个答案:

StringBuilder sb = new StringBuilder();
var words = textBox1.Text.Split(new char[] { ' ', '"', ',',etc. },
    StringSplitOptions.RemoveEmptyEntries);
int index = 0;
int prevIndex = 0;
int prevWordWidth = 0;//This variable is now kept across iterations
for (int i = 0; i < words.Length; i++)
{
    string word = words[i];

    //The non-scrambled string is from end of last word (prevIndex+prevWordWidth) 
    //up to the next word (index)
    index = textBox1.Text.IndexOf(word, prevIndex+prevWordWidth);
    string t = textBox1.Text.Substring(prevIndex+prevWordWidth, index-(prevIndex+prevWordWidth));

    prevIndex = index;
    prevWordWidth = word.Length;

    sb.Append(t);
    string s = textBox1.Text.Substring(index, prevWordWidth);
    if (index == -1) break;

    if (word.Length > 0)
    {
        ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(s.Trim());
        scrmbltb.GetText();
        sb.Append(word.Replace(s.Trim(), scrmbltb.scrambledWord));             
    }

}
textBox2.Text = sb.ToString(); //Note how this is only set at the end.

我上面提到的那些行仍然是主要的罪魁祸首,但是在循环的每次迭代中,你都将字符串生成器附加到文本框。字符串构建器的要点(至少我是这么认为)是在迭代上构建字符串,然后一次将所有字符串添加到文本框中。所以你只想在最后设置textBox2.Text