0

問題から始めて、手順がどのように機能するかを説明します。

次のようなエラーが発生します。

タイプ「System.Collections.Generic.IEnumerable(OfLunchMoneyGame.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ループなどを使用します)。

=条件が(等しい条件に一致するものがない場合や、複数のものが等しい条件に一致する場合など、要素が返されない条件も広く存在する可能性があります)であっても、1つのレコードのみが返されるという自動概念はありません。)。

1つの要素のみが必要であることを示すために、FirstSingleFirstOrDefault、またはSingleOrDefaultメソッドを使用できます。

例えば:

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

LunchMoneyGame.LunchMoneyMainForm.Groupこれにより、この場合に探しているタイプのオブジェクトが得られます。

余談ですが、上で概説した方法の違いを知ることは悪くありません。私の一般的な視点では(私は専門家ではないので):

  • Firstコレクションの最初のアイテムを返すか、コレクションが空の場合は例外をスローします
  • FirstOrDefaultコレクションの最初のアイテムを返します。空の場合はnullを返します
  • Singleコレクション内の唯一のアイテムを返すか、コレクションに1つのアイテムがない場合は例外をスローします
  • SingleOrDefaultコレクションの最初のアイテムを返します。コレクションが空の場合はnullを返し、コレクションに複数の要素がある場合は例外をスローします。

したがって、あなたの場合、=私が使用することをお勧めする条件を持つ単一のアイテムにのみ一致する必要があるため、SingleまたはSingleOrDefault

PS。申し訳ありませんが、私がnull上で言うとき、それはNothingVB.NETで話します

于 2013-03-27T02:39:35.087 に答える