【问题标题】:Don't want repeated random from list string不想从列表字符串中重复随机
【发布时间】:2014-02-07 01:50:04
【问题描述】:

我从数据库中将一些字符串添加到列表中,我随机字符串顺序并显示它,但我不希望随机字符串再次出现,所以我做了一个 remove(string) 但它不起作用。

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

 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 然后第三次我按下它不应该显示任何东西。

---编辑-----

这就是我获取列表的方式(此代码位于 !Page.IsPostBack 之外的 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();

}

【问题讨论】:

  • 您的示例中缺少某些内容,因为您似乎从未致电 RandomMCQ1()?
  • 我确实发布了我将 RandomMCQ1() 放入页面加载的帖子
  • 我无法将 RandomMCQ1() 放入按钮中,每次我点击按钮时它都会重新填充列表
  • 如果您想以随机顺序显示整个列表,您可能需要置换列表。与其选择列表中的随机元素并打印它,不如先随机重新排列列表,然后打印它。 This other answer 可能会有所帮助。
  • 什么置换?我不明白,除了置换之外没有其他方法吗?

标签: c# asp.net string list random


【解决方案1】:

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

有关洗牌列表的代码,请参见以下问题: Randomize a List<T>

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 请指导我使用 Session ,你的意思是将值存储在会话中,然后随机会话值?
    • @user2376998 - 是的。正如我所说 - 在第一次请求时从数据库读取并进入会话状态 (Session["foo"]= questionNo)。在从Session - questionNo = (List&lt;string&gt;)Session["foo"] 回发读取时,选择类似。
    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    相关资源
    最近更新 更多