0

我想创建一个程序,当我单击按钮时,它会在消息框中显示一个随机类别(来自我创建的类别列表)和正确的单词。

当我运行它时,类别是随机的,但是应该与类别一起使用的正确单词没有正确放置。 错误图像

另外,我知道一旦程序达到某个类别的负索引或显示所有类别时,程序将 崩溃

但我无法弄清楚要使用什么逻辑,以便一旦达到负值它就会自动停止删除索引。

代码:

namespace randomCategory
{
public partial class Form1 : Form
{

    Random rand = new Random();
    List<string> categories = new List<string> { "Book Titles", "Movie Titles", "Car Parts", "Human Body Parts", "Transportations" };


    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = categories;
    }

    public void selection()
    {
        // logic for setting a random category
        int index = rand.Next(categories.Count);
        var category = categories[index];


        // logic for assigning the word for a category
        switch (index)
        {
            case 0:
                MessageBox.Show(category, "Harry Potter");
                break;
            case 1:
                MessageBox.Show(category, "Summer Wars");
                break;
            case 2:
                MessageBox.Show(category, "Bumper");
                break;
            case 3:
                MessageBox.Show(category, "Eyes");
                break;
            case 4:
                MessageBox.Show(category, "Boat");
                break;
            default:
                MessageBox.Show("Empty!", "!!!");
                break;
        }

        categories.RemoveAt(index);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        selection();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
}
}
4

2 回答 2

3

您必须设置列表框选择以反映您选择的随机索引。

此外,如果列表中没有项目,则不应执行此操作。因此,将此代码添加到您的方法中:

if (categories.Count == 0)
    return;

问题可能是,当您从categories列表中删除一个项目时,索引号不再与您的switch语句匹配。例如,您的categories开始是:

{ "Book Titles", "Movie Titles", "Car Parts", "Human Body Parts", "Transportations" };

如果您从列表中选择任何项目,它将在您的开关中匹配。例如,如果您随机选择 1,那么您的程序将显示“Summer Wars”:电影名称。

但是随后您从列表中删除了该项目。您的列表现在如下所示:

{ "Book Titles", "Car Parts", "Human Body Parts", "Transportations" };

因此,您随机选择 2,即“人体部位”,因为您从列表中删除了一个项目。

解决此问题的一种方法是创建另一个列表,称为unusedCategories. 像这样初始化它:

List<int> unusedCategories = new List<int> { 0, 1, 2, 3, 4 };

现在,您从该列表中选择一个项目:

int selectedIndex = rand.Next(unusedCategories.Count);
int index = unusedCategories[selectedIndex];
// at this point, index is the index to one of the items in your `categories` list

switch (index)
{
    ....
}

unusedCategories.RemoveAt(selectedIndex);

And, of course, you'll change the if statement to:

if (unusedCategories.Count == 0)
    return;
于 2013-03-29T17:04:33.610 回答
0

If you want to convert your existing List of string to a Dictionary<T,T> one line of code can do it for you

var categories = new List<string> 
{ 
  "Book Titles",
  "Movie Titles",
  "Car Parts",
  "Human Body Parts",
  "Transportations" 
 };
var catDict = categories.ToDictionary(c => c);
于 2013-03-29T18:41:08.807 回答