尝试使用/ Enum填充List但是使用'type'就像'变量'一样

时间:2013-06-24 12:26:25

标签: c# types enums

我正在创建一副牌并在枚举中使用我的套装和值,但我的语法在试图填充我的列表套牌时没有。另外,Ace可以具有1或11的值,是否有某种方法可以将其合并到我的Enum中,或者我需要在执行诸如为二十一点求手之类的事情时编写代码?

public class Deck
{
    private List<Card> cards;
    private Random random = new Random();
    public Deck()
    {
        cards = new List<Card>();
        for (int s = 0; s < 4; s++)
            //for (int v = 0; v < 14; v++)
            foreach(Enum v in Values)
                cards.Add(new Card((Suits)s, (Values)v));
    }

以下是我的诉讼和价值:

public enum Suits
{
    Spades,
    Clubs,
    Diamonds,
    Hearts
}

public enum Values
{
    Ace = 1,
    Two = 2,
    Three = 3,
    Four = 4,
    Five = 5,
    Six = 6,
    Seven = 7,
    Eight = 8,
    Nine = 9,
    Ten = 10,
    Jack = 10,
    Queen = 10,
    King = 10
}

2 个答案:

答案 0 :(得分:6)

您的问题是这一行:

foreach(Enum v in Values)

您不能以这种方式枚举enumValuesenum 类型声明的名称,而不是一组值。

你可以这样做:

foreach (var v in Enum.GetValues(typeof(Values)))

答案 1 :(得分:1)

您需要使用Enum.GetValues()来获取枚举的所有值的数组。

然后你应该可以做这样的事情(不确定这是否会编译,但你应该知道):

foreach (var suit in Enum.GetValues(typeof(Suits)))
{
    foreach (var value in Enum.GetValues(typeof(Values)))
    {
        cards.Add(new Card((Suits)suit, (Values)value));
    } 
}

我认为你的价值观不会正常运作。使用TenKing之间的值之一初始化某些内容后,您将无法确定它原来是什么。

我认为你需要更像这样的东西(也将你的复数枚举名重命名为单数,以匹配正常的命名约定):

public enum Suit
{
    Spades,
    Clubs,
    Diamonds,
    Hearts
}

public enum Rank
{
    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
}

class Card
{
    readonly Suit _suit;
    readonly Rank _rank;

    public Card(Suit suit, Rank rank)
    {
        _suit = suit;
        _rank = rank;
    }

    public Rank Rank
    {
        get
        {
            return _rank;
        }
    }

    public Suit Suit
    {
        get
        {
            return _suit;
        }
    }

    public int Value
    {
        get
        {
            if (Rank >= Rank.Ten)
            {
                return 10;
            }
            else
            {
                return (int) Rank;
            }
        }
    }

    public override string ToString()
    {
        return _rank + " of " + _suit + " with value " + Value;
    }
}

您还可以使用Linq初始化Card列表,如下所示:

List<Card> cards = 
(
    from suit in Enum.GetValues(typeof(Suit)).OfType<Suit>()
    from rank in Enum.GetValues(typeof(Rank)).OfType<Rank>()
    select new Card(suit, rank)
).ToList();

如果您希望将Value计算与Rank更紧密地关联,而不是在Card中进行,则可以为Rank编写扩展方法:

static class RankExt
{
    public static int Value(this Rank rank)
    {
        if (rank >= Rank.Ten)
        {
            return 10;
        }
        else
        {
            return (int)rank;
        }
    }
}

然后,只要您有Rank,就可以使用Rank.Value(),例如卡的ToString()将成为:

public override string ToString()
{
    return _rank + " of " + _suit + " with value " + _rank.Value();
}