繁体   English   中英

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

[英]How to get both key and value from list separately with linq query

调试屏幕截图 我开始使用随机数组进行测验,但是在完成这项工作后,我意识到我无法追踪用户选择的答案。 有人向我展示了如何使用一些随机播放算法,但这使我感到困惑。

因此,我决定创建一个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();

然后我的按钮文本将键和值添加到文本中,我不希望那样,我只想将键显示在按钮文本中,然后能够访问其值。

有什么想法或我想念的地方吗? 我假设它在我的查询中,我不确定如何修复它。

谢谢

从根本上讲,您需要一个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; <-willl为您提供特定键的值。

实际上,您可以使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM