我正在尝试创建一种创建对象列表的方法。 这些对象将添加枚举器值。
我目前有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;
答案 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;
}
}
}