我开始使用随机数组进行我正在进行的测验,但在我开始工作之后,我意识到我无法跟踪用户的答案选择。我已经看过如何使用一些shuffle算法,但它让我很困惑。
所以我决定创建一个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 :(得分:1)
从根本上说,您需要一个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;
&lt; - willl为您获取特定密钥的值。
答案 1 :(得分: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;