如何使用linq查询分别从列表中获取键和值

时间:2014-01-19 05:44:47

标签: c# asp.net linq key-value

Screenshot for debugging我开始使用随机数组进行我正在进行的测验,但在我开始工作之后,我意识到我无法跟踪用户的答案选择。我已经看过如何使用一些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();

然后我的按钮文本为文本添加了键和值,我不希望这样,我只是希望键出现在按钮文本中,然后才能访问它的值。

任何想法或我遗失的地方?我假设它在我的查询中,我不知道如何解决它。

由于

2 个答案:

答案 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;