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

时间:2014-11-11 13:45:51

标签: c# windows winforms forms

我想知道如何使用此代码,目前正在开发一个锦标赛支架系统。

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

我查看了“列表数组”& “字符串数组”,但我似乎陷入困境,因为我无法确定要在代码中放入什么内容。

我的随机按钮目前看起来像这样:

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();
        }

4 个答案:

答案 0 :(得分:1)

执行此操作的最简单但不一定最有效的方法之一是将所有字符串放入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 shuffle对字符串进行随机播放,然后将洗牌后的字符串中的第一个条目分配给第一个文本框,将第二个条目分配给第二个文本框,依此类推。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

选择后删除每个项目怎么样?

尝试类似

的内容
 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;
}

但是从组合框中删除它们比代码更简单,更快。如果您希望它们仍然出现在您的组合框中,您可以同时在列表中,从该列表中获取您的项目并从那里删除它。 用户不会看到任何内容。

答案 3 :(得分:0)

要做到这一点,相当简单。

首先,您知道共有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();