我在数据库的列表中添加了一些字符串,我随机输入字符串顺序并显示它但我不希望随机字符串再次出现,所以我做了删除(字符串)但是它不起作用。
所以我声明了一个这样的列表字符串:
List<string> questionNo = new List<string>();
这是我在PageLoad上放置的代码(在Page.IsPostBack之外):
protected void RandomMCQ1()
{
Random r = new Random();
int index = r.Next(questionNo.Count());
randomString = questionNo[index]; // Random a string from list ( I declare randomString as a string in global)
questionNo.Remove(randomString); // Then remove it
}
所以我想通过在点击按钮后显示randomString来测试它:
protected void btnNext_Click(object sender, EventArgs e)
{
Response.Write(questionNo.Count); // Display list<string> count
Response.Write(randomString); // Display the random string .
}
我在列表中有2个值:10和11
所以列表的计数是2 单击按钮时计数正确(计数假定为2,单击按钮后,计数减少为1) 但随机字符串可以显示10或11,不应该是我第一次点击按钮时,它显示10或11,如果显示10,第二次我点击按钮它应该显示11然后第3次我按它不应该显示任何东西。
--- ----- EDIT
这就是我获取列表的方式(这段代码在PageLoad之外的PageLoad中)。
protected void PopulateMCQ()
{
string query = "...";
conn.Open();
SqlCommand cmd = new SqlCommand(query, conn);
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
Label questionID = new Label();
questionID.Text = dr["englishID"].ToString();
questionNo.Add(questionID.Text); // I add the values to the list<string> here
}
conn.Close();
}
答案 0 :(得分:0)
置换(shuffle)列表,然后从头到尾逐个返回元素。这将是你做你想做的最有效的方式。
对于洗牌的代码,请看这个问题: Randomize a List<T>
答案 1 :(得分:0)
最有可能的问题是如何/何时填充questionNo
。由于它只是常规对象,并且您没有显示如何在请求之间存储它,因此很有可能在请求开始时始终从DB中读取它。
因此,在第一个GET请求中,您会从列表中获得一些随机值,但在后续的POST请求中,您可能会从数据库重新加载questionNo
,因此它始终显示您的默认值。
如果问题确实存在,您需要坚持questionNo
和随机选择。最简单的方法是在第一次请求时将它们保存到Session
对象中,并在回发时从Session
读取。