2014-02-07 45 views
0

我從數據庫中添加了一些字符串到列表中,我隨機的字符串順序和顯示它,但我不想隨機字符串再次出現,所以我做了刪除(字符串)但它不會工作。不想從列表字符串重複隨機

因此,我宣佈一個列表的字符串是這樣的:

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,i之後點擊按鈕的計數,它減少到1) 但隨機字符串可顯示10或11,不應該是當我第一次點擊按鈕,它顯示10或11,如果它顯示10,第二我點擊它應該顯示的按鈕11然後第三次我按它不應該顯示什麼。

---編輯-----

這是我如何得到我的列表(此代碼是在pageLoad的外面!Page.IsPostBack)

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

你的例子中缺少一些東西,因爲它會出現你永遠不會調用RandomMCQ1()'? –

+0

我沒有發佈,我把RandomMCQ1()在頁面加載 – user2376998

+0

我不能把RandomMCQ1()在按鈕中,它將重新填充列表每當我按下按鈕 – user2376998

回答

0

置換(洗牌)名單,然後從頭到尾依次返回元素。這將是實現你想要的最有效的方式。

對於洗牌列表中看到這個問題的代碼: Randomize a List<T>

0

最有可能的問題是與如何/當你填充questionNo。由於它只是常規對象,並且沒有顯示如何在請求之間存儲它,所以在請求開始時總是從數據庫讀取數據的可能性很大。

因此,在第一次GET請求時,您會從列表中獲得一些隨機值,但對於後續的點擊POST請求,您可能會從DB重新加載questionNo,因此它始終顯示默認值。

如果確實存在修復問題,您需要堅持您的questionNo和隨機選擇。最簡單的方法是首先將請求保存到Session對象中,然後從Session開始讀取。

+0

是的,我從DB在頁面加載讀取它來填充我的questionNo – user2376998

+0

請指引我一起使用會話,U意味着存儲在會話中的值,然後隨機會話值? – user2376998

+0

@ user2376998 - 是的。正如我說 - 從DB上第一請求讀取,並把在會話狀態('會話[「foo」的] = questionNo')。 'questionNo =(列表)會話[ 「foo」 的]',供選擇類似 - 在回發從'Session'讀取。 –