Vb.net 如何建立此列表并将其随机化?

Vb.net 如何建立此列表并将其随机化?,vb.net,Vb.net,我正在为我的计算机科学课做一个测验,基本概念是你有15个关键词和15个定义。所有这些都需要随机显示,并且必须显示正确答案。用户必须将正确的定义与关键字匹配两次,然后该关键字和定义将不再显示。当所有答案都回答了两遍后,测验就结束了 我将关键字和定义都存储在同一个文件中,这样它们就不会失去同步。文本文件如下所示: Keyword1 = Definition1 Keyword2 = Definition2 Keyword3 = Definition3 etc(共15个) 我的主要表单如下所示: Pu

我正在为我的计算机科学课做一个测验,基本概念是你有15个关键词和15个定义。所有这些都需要随机显示,并且必须显示正确答案。用户必须将正确的定义与关键字匹配两次,然后该关键字和定义将不再显示。当所有答案都回答了两遍后,测验就结束了

我将关键字和定义都存储在同一个文件中,这样它们就不会失去同步。文本文件如下所示:

Keyword1 = Definition1
Keyword2 = Definition2
Keyword3 = Definition3
etc(共15个)

我的主要表单如下所示:

Public Class quiz
Private Sub quiz_load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles myBase.Load

Dim MyList As List(Of KeyValuePair(Of String, String)) = New List(Of String, String))
For Each line As String In System.IO.File.ReadAllLines("my-file-path")
    Dim Pair() As String = line.split("=")
    mylist.add(New KeyValuePair(Of String, String)(Pair(0), Pair(1)))
Next
我在标签中显示随机关键字,在单选按钮中显示定义。两个必须是随机定义,一个必须是所示关键字的正确定义,这也需要随机显示

我想问的是:

  • 如何完成此列表,因为它仅使用最后一行覆盖其他15行
  • 我如何随机化关键字和定义列表,以确定它们何时显示
  • 当每个关键字已与其定义匹配两次时,如何删除项目?例如:关键字1和定义1已经正确回答了两次,所以请从列表中删除,这样它就不会再次显示

  • 在解决了加载问题后,您可以按照此基本算法完成其余任务。我不想给你课堂作业的确切代码。弄明白这种事情是学习编程的一半乐趣

    • 循环回答每一个问题,保留当前问题的索引 问题
    • 声明新的答案列表并放置正确的答案 从中的当前问题添加到列表中
    • 再选择3个答案 随机得出的答案不是正确的,而且答案比已经得到的要多 选择此问题并将其添加到答案列表中
    • 随机化答案列表
    • 显示问题和答案
    • 对照当前问题的答案检查所选答案
    • 对每个问题重复

    这应该给你一个想法:

    Const NUMBER_OF_ANSWERS As Integer = 3
    
    Dim kv As New Dictionary(Of String, String)
    kv.Add("Keyword1", "Definition1")
    kv.Add("Keyword2", "Definition2")
    kv.Add("Keyword3", "Definition3")
    
    Dim r As New Random
    Dim kvRandom As List(Of KeyValuePair(Of String, String)) =
      kv.OrderBy(Function() r.Next).ToList
    
    'questions will appear in random order
    For Each line As KeyValuePair(Of String, String) In kvRandom
      Dim keyword As String = line.Key
      Dim correctDefinition As String = line.Value
    
      Dim keywords As New List(Of String)
      keywords.Add(keyword)
      keywords.AddRange(kv.Keys.Except({keyword}).
        OrderBy(Function() r.Next).Take(NUMBER_OF_ANSWERS - 1))
    
      Dim definitionsRandom As List(Of String) =
        keywords.Select(Function(x) kv(x)).OrderBy(Function() r.Next).ToList
    
      'TODO: need to write some code here
      'display keyword and three possible definitions to the user
      '(out of which one is correct)
      'answers will also appear in random order
      'Check answer against value stored in "correctDefinition"
    Next
    
    该代码几乎是不言自明的,如果您有任何问题,请在评论中告诉我

    编辑:以下是如何从文件中填充词典

    'assuming file structure is like this:
    'keyword1,definition1
    'keyword2,definition2
    'keyword3,definition3
    '...
    For Each line As String In IO.File.ReadAllLines("keywords_and_definitions.txt")
      Dim parts() As String = line.Split(",")
      kv.Add(parts(0), parts(1))
    Next
    

    请用你的题目来解释这个问题。“这个列表我做错了什么?”作为搜索结果,对未来的读者来说并没有多大意义。谢谢。你是这门课的老师还是学生?另外,这一行给我的印象是奇怪的
    Dim MyList as List(Of KeyValuePair(Of String,String))=New List(Of String,String))
    。学生,我不知道它到底出了什么问题,或者我不会把标题设置得这么模糊。你可以将decl缩短为
    Dim MyList as New List(Of KeyValuePair(Of String,String))
    。是什么让你认为只有最后一个被保留?循环结束时列表中有多少个元素?如果以后想将它们标记为匹配/使用,考虑一个列表(MyClass),其中类是代码> ITEMNEY(String Key)、定义(String)、使用(BOOL)< /代码>。但是,您不再想从<代码>()/代码>中分配,从列表(t)中分配。检查循环结束时的列表计数。你也不太可能真的想随机化它,否则你的下一个问题将是如何防止重复和其他问题。您可能想要的是将其洗牌,然后单击。加载文本,然后洗牌,然后设置显示。我也应该接受史蒂文斯对你的上一个问题的回答,因为你实现了它。我需要两个文件中的关键字和定义吗?例如
    公共关键字为String()=IO.File.ReadAllLines(“我的文件路径”)
    公共定义为String()=IO.File.ReadAllLines(“我的文件到defs的路径”)
    。然后当我去添加时,我会使用:
    kv.add(关键字(0)、定义(0))
    etc?@MattKent:您可以有一个文件,逗号、空格或制表符分隔,键+值。不,您应该遍历所有行并动态创建列表或字典,而不是硬编码
    0,0
    <代码>1,1等。顺便说一句,上面的代码有一个问题-它将显示与有问题一样多的答案-我正在努力解决它。@MattKent:代码现在已修复,您可以通过在代码开头定义的常量值来控制答案的数量。您可以在测试前或在应用程序配置(
    app.config
    文件)中指定动态参数。即使使用单选按钮,我是否需要控制答案的数量?(准确地说是3)这就是你给我留下的关于代码的评论,我添加了这个:
    LabelKeyword.Text=keyword
    RadioButtonDef1.Text=correctedDefinition
    RadioButtonDef2.Text=definitionsRandom
    RadioButtonDef3.Text=definitionsRandom
    我获得了榜首无线电按钮在工作,只有最下面的两个我似乎无法工作。我做错了什么?还有,有没有一种方法可以很快将正确答案分配给哪个单选按钮,或者我只需要像我所做的那样去做?谢谢你的帮助:)