2014-01-19 31 views
0

Screenshot for debugging我開始使用一個隨機數組進行測驗,但是在完成這個測試之後,我意識到沒有辦法讓我能夠跟蹤用戶選擇的答案。我已經展示瞭如何使用一些洗牌算法,但它讓我感到困惑。如何從linq查詢中分別獲取列表中的鍵和值兩者

所以我決定創建一個List<KeyValuePair>來保存我的數據集中的答案,關鍵是一個字符串,它是數據集的一行,值是一個整數,對於正確答案是1,對於錯誤答案是0 。

所以我正在做的是,我有四個按鈕被CSS程式化,我將按鈕文本轉換爲四個答案之一。這可能聽起來像不好的編程習慣,但它是我能想出的唯一東西,那就是將tab順序屬性更改爲1或0,以便我可以跟蹤最終顯示在結果頁面中的答案。

我使用的代碼是這樣的......

ds = MyDs(1); 

System.Random rnd = new System.Random(); 

var QA = new List<KeyValuePair<string,int>>(); 

QA.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[0]["CorrectAnswer"].ToString(),1)); 
QA.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[0]["WrongAnswer1"].ToString(), 0)); 
QA.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[0]["WrongAnswer2"].ToString(), 0)); 
QA.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[0]["WrongAnswer3"].ToString(), 0)); 

var myQa = QA.OrderBy(c=> rnd.Next()).Select(c=>c.Key.ToString()).ToList(); 

Label5.Text = ds.Tables[0].Rows[0]["Question"].ToString(); 

Button1.Text = myQa[0].ToString(); 
Button2.Text = myQa[1].ToString(); 
Button3.Text = myQa[2].ToString(); 
Button4.Text = myQa[3].ToString(); 

,這是好的,當你在myQa,關鍵像它應該顯示出來,但如果我這樣做...

var myQa = QA.OrderBy(c=> rnd.Next()).Select(c=>c.Key.ToString() + c.Value.ToString()).ToList(); 

然後我的按鈕文本添加鍵和值的文本,我不希望這一點,我只想要按鍵顯示在按鈕文本,然後能夠訪問它的價值。

任何想法或我失去了什麼東西?我假設它在我的查詢中,我不知道如何解決它。

感謝

回答

0

實際上,您可以使用ToDictionary方法而不是ToList。它接受密鑰選擇器和值選擇器參數。你可以

var myQa = QA.OrderBy(c=> rnd.Next()).ToDictionary(ks=>ks.Key.ToString(), vs=>vs..Value.ToString()); 
    foreach(var keyValuePair in myQa) 
    { 
     Button button = new Button(); 
     button.Text = keyValuePair.Key; 
     button.Tag= keyValuePair.Value; 
     SomeParentControl.Controls.Add(button); 
    } 

這樣你就可以在一個枚舉中同時具有鍵和值。你

也可以這樣做:

var myQaButtons = QA.OrderBy(c=> rnd.Next()).Select(c=>new Button{Text = c.Key, Tag = c.Value}).ToList(); 
    myQaButtons.ForEach(b=>SomeParentControl.Controls.Add(b)); 

或者乾脆

var myQa = QA.OrderBy(c=> rnd.Next()).Select(c=>new {c.Key, c.Value}).ToList(); 

    Button1.Text = myQa[0].Key; 
    Button1.Tag = myQa[0].Value 
    Button2.Text = myQa[1].Key; 
    Button2.Tag = myQa[1].Value; 
    Button3.Text = myQa[2].Key; 
    Button3.Tag = myQa[2].Value; 
    Button4.Text = myQa[3].Key; 
    Button4.Tag = myQa[3].Value; 
+0

這個我明白了,我理解了這個部分。我只是想你建議,但沒有myQa [0]。重點或myQa.Value – Chris

+0

我創建了小樣本,您可以在這裏http://sdrv.ms/1eKpR4o – Konstantin

+1

對不起,這是錯誤的鏈接看看這是正確的http://sdrv.ms/1eKpR4o – Konstantin

0

從根本上說,你需要一個Dictionary<TKey, TValue>

這裏:

var myQa = QA.OrderBy(c=> rnd.Next()).Select(c=>c.Key.ToString() + c.Value.ToString()).ToList();

您選擇兩個key及其value。相反,你可以這樣做:

var myQa = QA.OrderBy(c=> rnd.Next()).Select(c=>c.Key.ToString()).ToList();拿到鑰匙

var kValue = QA.Where(m=> m.Key == "Correct Answer").FirstOrDefault().Value; < - 預訂購讓你爲特定鍵的值。

+0

我改成了到字典清單,但仍然沒有看到如何讓價值。這是用我的第一次這種類型的集合,所以請原諒我,如果我不明白完全@ – Chris

+0

看到user2970223我編輯 –

+0

我看着你的編輯,我將不得不爲WrongAnswer1,WrongAnswer2和WrongAnswer3相同的查詢?如果是這樣,那麼我怎麼知道正確的值是正確的鑰匙?或者我誤解了你? – Chris

相關問題