2014-03-04 43 views
1

我正在为我的计算机科学课进行测验,基本概念是您有15个关键字和15个定义。所有需要随机显示,并出现正确的答案。用户必须将正确的定义与关键字匹配两次,然后该关键字和定义才会再次显示。当所有人都回答了两次测验结束后。在我的代码中导致这个错误的原因是什么?

我已将我的关键字和我的定义存储在同一个文件中,以免它们不同步。文本文件看起来像这样:

Keyword1,Definition1 
Keyword2,Definition2 
Keyword3,Definition3 
... 

我得到的问题是在我的代码中有两行。首先,我将参考所有相关的代码,使我所要求的尽可能清楚。我创建了一个类Answer和看起来像这样:

Public Class Answer 
Public Answer As String 
Public Answered As Boolean 

End Class 我的主要形式form1看起来是这样的:

Public Class Form1 
Const NUMBER_OF_ANSWERS As Integer = 3 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    kv = New Dictionary(Of String, Answer) 
    For Each line As String In IO.File.ReadAllLines("C:\Users\Matt\Documents\keywords.txt") 
     Dim parts() As String = line.Split(",") 
     kv.Add(parts(0), New Answer With {.Answer = parts(1), .Answered = False}) 
    Next 

    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 

     LabelKeyword.Text = keyword 
     RadioButtonDef1.Text = definitionsRandom(0) 
     RadioButtonDef2.Text = definitionsRandom(1) 
     RadioButtonDef3.Text = definitionsRandom(2) 
    Next 

End Sub 

我的错误是在以下两行:

kv.OrderBy(Function() r.Next).ToList即:

Error 1 Value of type 'System.Collections.Generic.List(Of System.Collections.Generic.KeyValuePair(Of String, flashquiz.Answer))' cannot be converted to 'System.Collections.Generic.List(Of System.Collections.Generic.KeyValuePair(Of String, String))'. C:\Users\Matt\Desktop\flashquiz\flashquiz\Form1.vb 62 11 flashquiz and

keywords.Select(Function(x) kv(x)).OrderBy(Function() r.Next).ToList是:

Error 2 Value of type 'System.Collections.Generic.List(Of flashquiz.Answer)' cannot be converted to 'System.Collections.Generic.List(Of String)'. C:\Users\Matt\Desktop\flashquiz\flashquiz\Form1.vb 75 15 flashquiz

我不知道什么是错的,所以任何帮助将不胜感激。 我知道这是关于Answer类,但不完全是。

回答

4

第一个问题的行是在这里:

Dim kvRandom As List(Of KeyValuePair(Of String, String)) = 
    kv.OrderBy(Function() r.Next).ToList 

在这一行,你正在服用的所有项目中kv,随机对它们进行排序,并返回它们作为一个List(Of Answer)。然后,您尝试将该列表分配给kvRandom变量,该变量被声明为List(Of KeyValuePair(Of String, String))。由于这两种类型不兼容,它会给你带来错误。

为了解决这个问题,您需要更改kvRandom声明为List(Of Answer),像这样:

Dim kvRandom As List(Of Answer) = kv.OrderBy(Function() r.Next).ToList() 

或者,你需要添加一个Select方法来正确地转换列表中的项目,例如:

Dim kvRandom As List(Of KeyValuePair(Of String, String)) = 
    kv.OrderBy(Function() r.Next) _ 
    .Select(Function(x) New KeyValuePair(Of String, String)(x.Key, x.Value.Answer)) _ 
    .ToList() 

第二问题的行是在这里:

Dim definitionsRandom As List(Of String) = 
     keywords.Select(Function(x) kv(x)).OrderBy(Function() r.Next).ToList 

Select方法正在返回由lambda表达式Function(x) kv(x)返回的项目列表。由于kvDictionary(Of String, Answer),这意味着kv(x)将返回一个Answer对象。因此,Select方法正在返回一个Answer对象的列表。随后按随机顺序对其进行排序并将其转换为List(Of Answer)对象。然后尝试将其分配给definitionsRandom变量,该变量为List(Of String)。由于它们是两种不同的不兼容类型,它会给你错误。

要解决该问题,您需要将您的调用中的lambda表达式更改为Select方法,以返回String而不是Answer对象。例如:

Dim definitionsRandom As List(Of String) = 
     keywords.Select(Function(x) kv(x).Answer).OrderBy(Function() r.Next).ToList 

通知,lambda表达式返回kv(x).Answer而非kv(x)

+0

谢谢修复该行,但我似乎仍然与另一个问题:'kv.OrderBy(Function()r.Next).ToList'我该如何解决这一问题? –

+1

糟糕。错过了那部分。我更新了我的答案 –

相关问题