【问题标题】:How to add enum to a list如何将枚举添加到列表中
【发布时间】:2014-10-20 11:59:41
【问题描述】:

我有一个名为 Card 的类,其属性为 CardNumbers

Private _number As CardNumbers
    Public Property Number() As CardNumbers
        Get
            Return _number
        End Get
        Set(ByVal value As CardNumbers)
            _number = value
        End Set
    End Property

我有这个卡号枚举,用作Card 的属性。

Enum CardNumbers
    Ace = 1
    Two = 2
    Three = 3
    Four = 4
    Five = 5
    Six = 6
    Seven = 7
    Eight = 8
    Nine = 9
    Ten = 10
    Jack = 11
    Queen = 12
    King = 13
End Enum

现在,我有一个循环将CardNumbers 插入Dim Cards As New List(Of Card),但我不知道如何将每个CardNumbers 添加到列表中。研究了一段时间。任何人都可以帮忙吗?谢谢。

更新: 我现在有这个代码来添加创建类Card 的实例,然后添加到名为Cards 的卡片列表中:

Dim c As New Card()
        For Each n As CardNumber.CardNumbers In [Enum].GetValues(GetType(CardNumber.CardNumbers))
            c.Number = n
            Cards.Add(c)
        Next

然后,我收到 NullReferenceException 错误。

【问题讨论】:

  • 搜索“类型安全枚举模式”
  • @RalphDeGuzman - 你还没有向我们展示如何实例化 Card 实例,所以我们不知道如何从 string 转到 Card。您需要提供更多代码。

标签: vb.net list class loops enums


【解决方案1】:

一些可用于卡片和套牌的类。

Public Enum aRank
    Two = 2
    Three = 3
    Four = 4
    Five = 5
    Six = 6
    Seven = 7
    Eight = 8
    Nine = 9
    Ten = 10
    Jack = 11
    Queen = 12
    King = 13
    Ace = 14
End Enum

Public Enum aSuit
    Clubs
    Diamonds
    Hearts
    Spades
End Enum

Class Card
    Private _rank As aRank
    Private _suit As aSuit

    Public ReadOnly Property Rank As aRank
        Get
            Return Me._rank
        End Get
    End Property

    Public ReadOnly Property Suit As aSuit
        Get
            Return Me._suit
        End Get
    End Property

    Public Sub New(rank As aRank, suit As aSuit)
        Me._rank = rank
        Me._suit = suit
    End Sub
End Class

Class DeckOfCards
    Private _deck As List(Of Card)
    Private Shared _prng As New Random

    Public Sub New()
        Me.Shuffle()
    End Sub

    Public Sub Shuffle()
        Me._deck = New List(Of Card)
        For Each r As aRank In [Enum].GetValues(GetType(aRank))
            For Each s As aSuit In [Enum].GetValues(GetType(aSuit))
                Me._deck.Add(New Card(r, s))
            Next
        Next
    End Sub

    Public Function GetCard() As Card
        If Me.CardsRemaining > 0 Then
            Dim idx As Integer = DeckOfCards._prng.Next(Me._deck.Count)
            Dim rvcard As Card = Me._deck(idx)
            Me._deck.RemoveAt(idx)
            Return rvcard
        Else
            '''TODO
            'code for no more cards error
            Return Nothing
        End If
    End Function

    Public ReadOnly Property CardsRemaining As Integer
        Get
            Return Me._deck.Count
        End Get
    End Property
End Class

【讨论】:

    【解决方案2】:

    假设你有这一行:

    Dim n As CardNumbers = 1
    

    那么这会给你“王牌”:

    Dim s As String = [Enum].GetName(GetType(CardNumbers), n)
    

    【讨论】:

    • 好吧,我知道我捕获了字符串值,但是,如何将它添加到Cards
    • @RalphDeGuzman - 你还没有向我们展示如何实例化 Card 实例,所以我们不知道如何从 string 转到 Card。您需要提供更多代码。
    • 哦,我明白了,实际上,我进入了另一个名为 Deck 的类,其属性为 Cards 作为 List(Of Card)
    • @RalphDeGuzman - 如果它是给我的,你需要在你的回复中添加@Enigmativity(中间没有空格)。
    • @Enigmativity - 好的。谢谢。我编辑了我的问题并获得了正确的 Number 属性类型。我真正的问题是,如何将枚举的每个成员添加到名为 Cards 的卡片列表中
    【解决方案3】:

    您可以这样创建一个包含 13 张卡片的列表:

    Dim list As New List(Of Card)((From item In [Enum].GetValues(GetType(CardNumbers)) Select New Card With {.Number = CType(item, CardNumbers)}))
    

    话虽如此,您可能还想看看我在这篇 SO 帖子中的回答:

    Vb conceptual understanding of creating objects within a class

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2015-07-20
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多