添加类以使用枚举值动态列出

时间:2019-09-23 11:00:13

标签: c# oop

我正在尝试创建一种创建对象列表的方法。 这些对象将添加枚举器值。

我目前有2个枚举器:CardType,CardColor。 分配CardType值可按预期进行,但是当我使用完全相同的代码分配CardColor时,它总是返回相同的值(红色)。

我已经以注释形式包含了我已经尝试过的switch语句。

具有主要方法的类:

 public class CardStack
        {
            Card CardObject;
            List<Card> cardList;
            public CardStack()
            {
                cardList = new List<Card>();
                CardObject = new Card();
            }
            public List<Card> getCardList()
            {     
                for(int i = 1; i <= Enum.GetNames(typeof(CardType)).Length; i++)
                {
                    CardObject.Type = addCardType(i);
                    for(int n =0; n <= 3; n++)
                    {

                        CardObject.Color = addCardColor(n);
                        cardList.Add(CardObject);
                    }

                    CardObject = new Card();
                }
                return cardList;
            }

            public CardColor addCardColor(int colorNumber)
            {
                //Debug.WriteLine(colorNumber.ToString());
                //switch (colorNumber)
                //{

                //    case 0: return CardColor.Green;
                //    case 1: return CardColor.Blue;
                //    case 2: return CardColor.Yellow;
                //    case 3: return CardColor.Red;                
                //    default:
                //        return CardColor.Yellow;
                //}
                return (CardColor)colorNumber;
            }
            public CardType addCardType(int typeNumber)
            {
                return (CardType)typeNumber;
            }

        }

枚举CardColor:

public enum CardColor
{
    Green,
    Blue,
    Yellow,
    Red
}

枚举CardType:

public enum CardType
{
   One = 1,
   Two = 2,
   Three = 3,
   Four = 4,
   Five = 5,
   Six = 6,
   Give_2,
   Take_1,
   Which
}

我的调试输出(缩短):

 Type: One; Color: Red;
[0:] Type: One; Color: Red;
[0:] Type: One; Color: Red;
[0:] Type: One; Color: Red;
[0:] Type: Two; Color: Red;
[0:] Type: Two; Color: Red;
[0:] Type: Two; Color: Red;
[0:] Type: Two; Color: Red;
[0:] Type: Three; Color: Red;
[0:] Type: Three; Color: Red;
[0:] Type: Three; Color: Red;
[0:] Type: Three; Color: Red;

3 个答案:

答案 0 :(得分:2)

for(int i = 1; i <= Enum.GetNames(typeof(CardType)).Length; i++)
{
    CardObject.Type = addCardType(i);         // Sets Card Type
    for(int n =0; n <= 3; n++)
    {
        CardObject.Color = addCardColor(n);   //1. Sets Color on THE SAME CardObject
        cardList.Add(CardObject);             //2. Adds THE SAME CardObject 4 times
    }
    CardObject = new Card();                  //3. create new Object => all of the 
                                              // above added references point to
                                              // the same CardObject, which has 
                                              // been set to "Red".
}

解决方案:移动标有// 3的行。在内部for循环中,就在// 2之后。

不相关:

  • 我建议创建一个参数化的构造函数,因此您只需执行cardList.Add(new Card(type, color))
  • 由于卡的类型和颜色不变,因此它们应为只读。实际上Card应该是immutable
  • 只需使用foreach来迭代enum values

改进版本:

public IEnumerable<Card> GetCardList()
{
    foreach (CardType type in Enum.GetValues(typeof(CardType)))
    {
        foreach (CardColor color in Enum.GetValues(typeof(CardColor)))
        {
            yield return new Card(type,color);
        }
    }
}

(请参见yield上下文关键字)

Card处:

public class Card
{
    public readonly CardType Type;
    public readonly CardColor Color;

    public Card( CardType type, CardColor color )
    {
        this.Type = type;
        this.Color = color;
    }
}

答案 1 :(得分:0)

在当前代码的内部循环中,您正在修改Card(CardObject)的同一实例的属性,同时将其添加到cardList。这意味着,所有引用在上一个循环中都具有与Color相同的值,在您的情况下为Red。

您需要做的是在内部循环中重新初始化CardObject。例如,

for(int i = 1; i <= Enum.GetNames(typeof(CardType)).Length; i++)
{
    CardObject.Type = addCardType(i);
    for(int n =0; n <= 3; n++)
    {
         CardObject = new Card();   // Change here
         CardObject.Color = addCardColor(n);
         cardList.Add(CardObject);
    }
}

这将确保您在内环中每次都在处理Card的新实例。

与此同时,另一种使用Linq完成相同任务的方法是

var list = Enum.GetValues(typeof(CardType))
               .Cast<CardType>()
               .SelectMany(type => Enum.GetValues(typeof(CardColor))
                                       .Cast<CardColor>()
                                       .Select(color => 
                                        new Card {Type = type, Color = color}));

答案 2 :(得分:0)

使用foreach遍历枚举值。在每次交互中创建一个新的CardObject(内循环!)并将它们添加到列表中。

public class CardStack
{
    private readonly List<Card> _cardList;
    public CardStack()
    {
        _cardList = getCardList();

    }
    private static List<Card> getCardList()
    {
        var localList = new List<Card>();
        foreach (CardType type in Enum.GetValues(typeof(CardType)))
        {
            foreach (CardColor color in Enum.GetValues(typeof(CardColor)))
            {
                var cardObject = new Card(){Type = type, Color = color};
                localList.Add(cardObject);
            }
        }

        return localList;
    }
}
}