随机化RichTextBox的行

时间:2013-03-11 18:51:25

标签: c#

好吧,我一直在尝试随机化我的richtextbox的行,现在它开始让我烦恼,因为我正在使用随机但是它不起作用......当我使用它时它会重复一些行多个时间,而不是包括一些......

我看过:RichTextBox - sorting lines randomly

但它根本没有帮助我。

RichtextBox rtb = new RichTextBox();    
Random R = new Random();
int y;
rtb.Text = "";
for (int i = 0; i < richTextBox1.Lines.Length; i++)
{
   y = R.Next(0, richTextBox1.Lines.Length);
   rtb.Text = rtb.Text + richTextBox1.Lines[y].ToString() + "\r\n";
}
richTextBox2.Text = rtb.Text;

例如,如果我输入,

  

Lorem ipsum dolor坐下来,精神上的精神。南   aliquam enim。在lacus magna的Proin。 Nam bibendum,增加非semper   fringilla,ante est interdum ipsum,egestas urna dolor vel risus。   Phasellus eget dui non augue pretium ullamcorper at ac tellus。桑达   mattis risus sit amet metus dictum egestas。 Phasellus tempus blandit   enim,ac congue urna bibendum sed。 Sed iaculis pulvinar dui vel   tristique。 Etiam justo metus,在pellentesque eu,eleifend   id nunc。

它给了我,

  

Sed m​​attis risus sit amet metus dictum egestas。 Phasellus tempus   blandit enim,ac congue urna bibendum sed。 Nam bibendum,augue non   semper fringilla,ante est interdum ipsum,egestas urna dolor vel   risus。 Sed m​​attis risus坐在amet metus dictum egestas。 Phasellus   tempus blandit enim,ac congue urna bibendum sed。 Sed iaculis   pulvinar dui vel tristique。 Etiam justo metus,idequat in   pellentesque eu,eleifend id nunc。 Lorem ipsum dolor sit amet,   奉献精神。 Nam in aliquam enim。在lacus的Proin   蚤。

重复一行,一行错过......文字越长,就越频繁出现。

我没有做过太长时间的C#,如果这很简单就很抱歉。 :/

2 个答案:

答案 0 :(得分:2)

这是伪代码中的逻辑:

Foreach line in original
Choose a random line
Add it to the output

你永远不会考虑你已经输出了哪些行,因此不知道下次不会选择它们。

请注意,在您提供的链接中,他们建议首先将行提取到结构中,然后改变该结构以提供新的排序。这可确保您最终获得每一行。

有几种适用于混洗的算法,最简单的是:

Select the first item
Select a random line, after or including the previous selection
Swap the two selections
Repeat moving the first selection to the left

答案 1 :(得分:1)

随机意味着“只是” - 它将返回一个介于0和(富文本框中的行数 - 1)之间的数字。没有唯一性的保证(实际上它不太可能)。

如果您想以独特的顺序获取它们,则必须跟踪所使用的顺序,而不是再次使用它们。

一个简单的例子(不一定有效)

   List<int> usedLineIndexes = new List<int>();

   while (usedLineIndexes.Count < richTextBox1.Lines.Length)
   {
        int y = R.Next(0, richTextBox1.Lines.Length);
        if (usedLineIndexes.Contains(y))
            continue;   // Try again


        usedLineIndexes.Add(y);

        rtb.Text = rtb.Text + richTextBox1.Lines[y].ToString() + "\r\n";
   }

同样,这是未经测试的低效代码,但它会给你一个想法。