在c#windows窗体中从文本文件中随机选取名称是不可重复的

本文关键字:选取 窗体 c#windows 文本 随机 文件 | 更新日期: 2023-09-27 18:30:03

我想知道如何处理这段代码,目前正在使用锦标赛支架系统。

目前,我已经创建了一个comboBox,它从"log.txt"中提取所有行,txt文件中有16行;然后我创建了一个分配按钮,该按钮应该将所有名称分配到名为User1->User16的16个文本框中,但相同的名称不能重复。

我查看了"列表数组"&"字符串数组",但我似乎被卡住了,因为我真的不知道该在代码中放什么。

我的随机按钮现在看起来是这样的:

private void assign_Click(object sender, EventArgs e)
    {
        int x;
        Random rnd = new Random();
        x = rnd.Next(0, 16);
        User1.Text = comboBox2.Items[x].ToString();
        x = rnd.Next(0, 16);
        User2.Text = comboBox2.Items[x].ToString();
        x = rnd.Next(0, 16);
        User3.Text = comboBox2.Items[x].ToString();
        x = rnd.Next(0, 16);
        User4.Text = comboBox2.Items[x].ToString();
        and so on untill i hit 
        x = rnd.Next(0, 16);
        User16.Text = comboBox2.Items[x].ToString();
        }

在c#windows窗体中从文本文件中随机选取名称是不可重复的

实现这一点的最简单但不一定是最高效的方法之一是将所有字符串放入List<string>中,并逐个随机移除它们。如果你把所有的文本框都放在一个集合中,效果会更好。例如,给定一个名为myStrings的字符串列表和一组名为myTextboxes的文本框,您可以:

for (var i=0; i < myStrings.Count; i++) 
{
    var idx = rnd.Next(0, myStrings.Count);
    myTextboxes[i].Text = myStrings[idx];    // Note: we are assuming the two collections have 
                                             // the same length
    myStrings.RemoveAt(idx);        
}

这很容易实现,也很容易正确,但它的效率并不高(对于16个项目,这可能无关紧要),因为您的集合会重复调整大小。为了获得更有效的方法,首先使用Fisher Yates洗牌来洗牌,然后将洗牌后的字符串中的第一个条目分配给第一个文本框,第二个分配给第二个,依此类推

您可以使用List,在每次分配之后,您可以从列表中删除分配的项。这样可以防止重复。

http://msdn.microsoft.com/en-us/library/cd666k3e(v=vs.110).aspx

选择每个项目后删除它如何?

试试之类的东西

 comboBox1.Items.RemoveAt(x);

添加后,每次您的

x = rnd.Next(0, 16);

代码将减少为

x = rnd.Next(0, 15);

直到它达到零。一种不同的方法是在选择一个随机循环遍历所有填充的循环(或者对于更简单的代码,通常是全部循环)并检查它是否已经被选择之后。如果已经选择,请获取一个新的,直到它不同为止。

为此,您可以使用一个文本框数组(将您拥有的内容存储在一个数组中),并像一样循环使用它们

    for(int i=0;i<16;i++)
    if(textBoxArray[i].Text==comboBox2.Items[x].toString()){
    chosen=true;
}

但是,从组合框中删除它们要比代码简单得多,速度也快得多。如果你想让它们仍然出现在你的组合框中,你可以同时出现在列表中,从该列表中获取你的项目并将其删除。用户将看不到任何内容。

要实现这一点,非常简单。

首先,你知道总共有16个项目。您不需要随机化列表,而是随机化用于访问列表项的索引。这部分你知道。

为了避免重复项目,您需要保留已使用的索引列表。一旦你确定了一个未使用的索引,就需要访问你的列表。

示例:

class Sample
{
   List<int> _usedIndexes;
   public Sample()
   {
      _usedIndexes = new List<int>();
   }   
   public int GetRandomIndex(int s, e)
   {
      Random rnd = new Random();
      //Initialize with a random number
      int x = rnd.Next(s, e);
      //While the index exists in the list of used indexes, get another random number.
      while(_usedIndexes.Exists(index => index == x))
      {
         x = rnd.Next(s, e);
      }
      //Add the number to the list of used indexes 
      _usedIndexes.Add(x);
      return x;
   }
}

然后,您只需访问您所拥有的带有索引的名称列表,如下所示:

int unusedIndex = GetRandomIndex(0, 16);
User1.Text = comboBox2.Items[unusedIndex].ToString();