0

我将从问题开始,然后描述该过程的工作原理。

我收到一条错误消息:

“System.Collections.Generic.IEnumerable(Of LunchMoneyGame.LunchMoneyMainForm.Group)”类型的值无法转换为“LunchMoneyGame.LunchMoneyMainForm.Group”。

指出问题的蓝色下划线Dim obj As LunchMoneyGame.LunchMoneyMainForm.Group = From r In temp Where r.ID = Number Select r位于操作员的右侧。

我知道这与明确性有关

--

这是我正在转换为文本游戏的桌面纸牌游戏。

此子程序的目标是从玩家手中减去一张牌并将其添加到弃牌堆中。一旦添加到弃牌堆,我就会调用弃牌堆,将牌从弃牌堆移到牌堆。

问题从数字生成器开始。我正在做的是从牌组中随机挑选一张牌。通过生成卡片组中卡片的卡片 ID。使用 linq 生成 ID 后,生成的数字然后拿一张卡片,然后将卡片添加到玩家库存(数量整数),并从牌组中减去。

T 代表轮到谁了。目前,出于测试目的,我仅根据 T 变量为 2 名玩家编写了代码。

  Private Sub GrabFromDeckAndDiscard()
        Dim CardCheckBoxInteger As Integer
        'ReDeclare CheckBox Array for Private sub
        Dim CardCheckBoxArray() As CheckBox = {CardCheckBox1, CardCheckBox2, CardCheckBox3, CardCheckBox4, CardCheckBox5}
        'Discard
        Select Case T
            Case 0
                Player1HandGroup(NumberArray(Checks)).QuantityInteger -= 1
            Case 1
                Player1HandGroup(NumberArray(Checks)).QuantityInteger2 -= 1
            Case 2
                Player1HandGroup(NumberArray(Checks)).QuantityInteger3 -= 1
            Case 3
                Player1HandGroup(NumberArray(Checks)).QuantityInteger4 -= 1
            Case 4
                Player1HandGroup(NumberArray(Checks)).QuantityInteger5 -= 1
        End Select
        'Add Card to Discard Pile
        DiscardGroup(NumberArray(Checks)).QuantityInteger += 1
        'Shuffle Deck from Discard Pile if Deck is out of cards
        Call DiscardPile()
        'Reset Number Generator, unless weapon isn't discard
        Dim temp As IEnumerable(Of LunchMoneyGame.LunchMoneyMainForm.Group) = From r In DeckGroup Where r.QuantityInteger > 0 Select r

        If temp IsNot Nothing AndAlso temp.count > 0 Then
            Number = (temp(Rnd.Next(0, temp.Count)).ID)
            ' ** Edit **: This will give you the actual object to be manipulated
            Dim obj As LunchMoneyGame.LunchMoneyMainForm.Group = (From r In temp Where r.ID = Number Select r).Single


            Dim PlayerQuantitySubtractionInteger As Integer
            For PlayerQuantitySubtractionInteger = ChecksDynamicA To ChecksDynamicB
                ' ** Edit **
                obj.QuantityInteger -= 1
                'Select the Player depending value of T
                Select Case T
                    Case 0
                        Player1HandGroup(Number).QuantityInteger += 1
                    Case 1
                        Player1HandGroup(Number).QuantityInteger2 += 1
                    Case 2
                        Player1HandGroup(Number).QuantityInteger3 += 1
                    Case 3
                        Player1HandGroup(Number).QuantityInteger4 += 1
                    Case 4
                        Player1HandGroup(Number).QuantityInteger5 += 1
                End Select
                CardTypeArray(PlayerQuantitySubtractionInteger) = Player1HandGroup(Number).CardType
                CardCheckBoxArray(TextBoxInteger).Text = Player1HandGroup(Number).CardNameString
                NumberArray(PlayerQuantitySubtractionInteger) = Number
            Next PlayerQuantitySubtractionInteger
        End If

        'Switch to next player
        Select Case T
            Case 0
                For CardCheckBoxInteger = 0 To 4
                    CardCheckBoxArray(CardCheckBoxInteger).Text = Player1HandGroup(NumberArray(CardCheckBoxInteger + 5)).CardNameString
                Next
                T += 1
            Case 1
                If GameSize = 2 Then
                    For CardCheckBoxInteger = 0 To 4
                        CardCheckBoxArray(CardCheckBoxInteger).Text = Player1HandGroup(NumberArray(CardCheckBoxInteger)).CardNameString
                    Next CardCheckBoxInteger
                    T -= 1
                End If
                If GameSize > 2 Then
                    T += 1
                End If
            Case 2
            Case 3
            Case 4

        End Select
        Label1.Text = T.ToString

        'Clear Check Boxes when turn is finished
        For CardCheckBoxInteger = 0 To 4
            CardCheckBoxArray(CardCheckBoxInteger).Checked = False
        Next

        'Turn off play button
        PlayButton.Enabled = False
    End Sub
4

1 回答 1

0
From r In temp 
Where r.ID = Number 
Select r

Where返回与子句匹配的所有内容的集合(参见MSDN文档)。.NET 将其表示为 IEnumerable,这意味着可以迭代的事物的集合(例如,使用For循环或类似的东西)。

没有自动的概念,即使您的条件是,您也只会返回一条记录=(广义上,也可能存在不返回任何元素的条件,例如当没有任何内容与相等条件匹配或多个事物与相等条件匹配时)。

为了表明您只需要一个元素,您可以使用FirstSingleFirstOrDefaultSingleOrDefault方法。

例如:

 Dim obj As LunchMoneyGame.LunchMoneyMainForm.Group = (From r In temp Where r.ID = Number Select r).Single()

这会给你一个 type 的对象LunchMoneyGame.LunchMoneyMainForm.Group,我认为你在这种情况下正在寻找它。

顺便说一句,了解我上面概述的方法之间的区别也不错。以我的外行观点(因为我不是专家):

  • First返回集合中的第一项,如果集合为空,则抛出异常
  • FirstOrDefault返回集合中的第一项,如果为空,则返回 null
  • Single返回集合中唯一的项目,如果集合中没有一个项目,则抛出异常
  • SingleOrDefault返回集合中的第一项,如果集合为空,则返回 null,如果集合有超过 1 个元素,则抛出异常

所以在你的情况下,因为你应该只在一个项目上匹配=我建议使用的条件SingleSingleOrDefault

PS。抱歉,当我null在上面说时,那将是Nothing在 VB.NET 中说的

于 2013-03-27T02:39:35.087 回答