不希望列表字符串重复随机

时间:2014-02-07 01:50:04

标签: c# asp.net string list random

我在数据库的列表中添加了一些字符串,我随机输入字符串顺序并显示它但我不希望随机字符串再次出现,所以我做了删除(字符串)但是它不起作用。

所以我声明了一个这样的列表字符串:

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

}

2 个答案:

答案 0 :(得分:0)

置换(shuffle)列表,然后从头到尾逐个返回元素。这将是你做你想做的最有效的方式。

对于洗牌的代码,请看这个问题: Randomize a List<T>

答案 1 :(得分:0)

最有可能的问题是如何/何时填充questionNo。由于它只是常规对象,并且您没有显示如何在请求之间存储它,因此很有可能在请求开始时始终从DB中读取它。

因此,在第一个GET请求中,您会从列表中获得一些随机值,但在后续的POST请求中,您可能会从数据库重新加载questionNo,因此它始终显示您的默认值。

如果问题确实存在,您需要坚持questionNo和随机选择。最简单的方法是在第一次请求时将它们保存到Session对象中,并在回发时从Session读取。