【问题标题】:How can I go only once in a switch case?我怎样才能在开关盒中只去一次?
【发布时间】:2016-01-02 11:24:53
【问题描述】:

我在 C# 中进行了一次测验,我的问题是用随机数随机询问的。问题是我只想在每种情况下都去一次。我怎样才能做到这一点?

感谢您的回答。

Random rdmNb = new Random();
int rdm1 = rdmNb.Next(1, 11);

switch (rdm1)
{
    case 1:           
        lblQuesttion.Text = strQ1;
        break;
    case 2:
        lblQuesttion.Text = strQ2;
        break;
    case 3:
        lblQuesttion.Text = strQ3;
        break;
    case 4:
        lblQuesttion.Text = strQ4;
        break;
    case 5:
        lblQuesttion.Text = strQ5;
        break;
    case 6:
        lblQuesttion.Text = strQ6;
        break;
    case 7:
        lblQuesttion.Text = strQ7;
        break;
    case 8:
        lblQuesttion.Text = strQ8;
        break;
    case 9:
        lblQuesttion.Text = strQ9;
        break;
    case 10:
        lblQuesttion.Text = strQ10;
        break;
}

【问题讨论】:

  • “去一次”是什么意思?
  • 去一次糟糕的英语对不起。

标签: c# switch-statement case


【解决方案1】:

创建您的问题列表

List<string> questions = new List<string>()
{
   strQ1,strQ2,strQ3,strQ4,strQ5,strQ6,strQ7,strQ8,strQ9,strQ10
};

然后更改您的随机生成以从列表中查找问题

Random rdmNb = new Random();
int rdm1 = rdmNb.Next(0, questions.Count);

lblQuesttion.Text = questions[rdm1];

并从列表中删除提出的问题

questions.RemoveAt(rdm1);

不需要开关....

请务必在驱动您选择下一个问题的循环之外声明 Random 变量。如本例所示

// Declare globally the random generator, not inside the question loop
Random rdmNb = new Random();

while (questions.Count > 0)
{
    int rdm1 = rdmNb.Next(0, questions.Count);
    string curQuestion = questions[rdm1];
    questions.RemoveAt(rdm1);

    lblQuestion.Text = curQuestion;

    ... ?code to handle the user input?
}

编辑
在表单内声明和初始化具有全局范围的问题列表。

public class MyForm : Form
{
     // Declaration at global level
     List<string> questions;

     public MyForm()
     {
         InitializeComponent();
         LoadQuestions();
     }

     private void LoadQuestions()
     {
        questions = new List<string>()
        {
            strQ1,strQ2,strQ3,strQ4,strQ5,strQ6,strQ7,strQ8,strQ9,strQ10
        };

        // In future you could change this method to load your questions
        // from a file or a database.....
     }

}

【讨论】:

  • 我对您的回答有疑问:我在提出问题的方法中多次调用,并且每次声明列表时都包含 10 个问题,因此会重新初始化。你有其他解决方案吗? :)
  • 您需要在全局级别移动列表的初始化。假设您有一个 WinForms 应用程序,然后在全局级别声明列表变量,然后在 Form_Load 事件中使用问题序列对其进行初始化(也许将来您想从文件或数据库中读取它们)。还提供一种方法,您可以调用该方法来重新初始化(将问题读取到)列表
  • 你有例子吗?我不知道在全局级别初始化某些东西的语法。
  • 这是一个 winforms 应用程序吗?
【解决方案2】:

你总是可以这样:

List<string> questions = new List<string>()
{
   strQ1,strQ2,strQ3,strQ4,strQ5,strQ6,strQ7,strQ8,strQ9,strQ10
};

var rnd = new Random();
var questionsStack = new Stack<string>(questions.OrderBy(x => rnd.Next()));

现在您只需 .Pop() 根据需要从堆栈中提出问题,如下所示:

if (questionsStack.Count > 0)
{
    lblQuesttion.Text = questionsStack.Pop();
}

【讨论】:

  • 给我一个例子? :)
猜你喜欢
  • 2011-01-16
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多