C# 获取具有不同键的重复值的枚举变量的值
我列举了52张扑克牌,如下所述C# 获取具有不同键的重复值的枚举变量的值,c#,enums,C#,Enums,我列举了52张扑克牌,如下所述 public enum Card { AceClubs = 11, AceDiamonds = 11, AceHearts = 11, AceSpades = 11, DeuceClubs = 2, DeuceDiamonds = 2, DeuceHearts = 2, DeuceSpades = 2, EightClub
public enum Card
{
AceClubs = 11,
AceDiamonds = 11,
AceHearts = 11,
AceSpades = 11,
DeuceClubs = 2,
DeuceDiamonds = 2,
DeuceHearts = 2,
DeuceSpades = 2,
EightClubs = 8,
EightDiamonds = 8,
EightHearts = 8,
EightSpades = 8,
FiveClubs = 5,
FiveDiamonds = 5,
FiveHearts = 5,
FiveSpades = 5,
FourClubs = 4,
FourDiamonds = 4,
FourHearts = 4,
FourSpades = 4,
JackClubs = 11,
JackDiamonds = 11,
JackHearts = 11,
JackSpades = 11,
KingClubs = 13,
KingDiamonds = 13,
KingHearts = 13,
KingSpades = 13,
NineClubs = 9,
NineDiamonds = 9,
NineHearts = 9,
NineSpades = 9,
QueenClubs = 12,
QueenDiamonds = 12,
QueenHearts = 12,
QueenSpades = 12,
SevenClubs = 7,
SevenDiamonds = 7,
SevenHearts = 7,
SevenSpades = 7,
SixClubs = 6,
SixDiamonds = 6,
SixHearts = 6,
SixSpades = 6,
TenClubs = 10,
TenDiamonds = 10,
TenHearts = 10,
TenSpades = 10,
ThreeClubs = 3,
ThreeDiamonds = 3,
ThreeHearts = 3,
ThreeSpades = 3
}
我想从枚举创建一个列表
var cards = Enum.GetValues(typeof(Card));
但它返回列表中的重复键
您可以使用Linq从阵列中删除重复项:
var uniqueCards = cards.Distinct().ToArray();
你的错误是对不同的事物使用相同的值。枚举不具有重复的值(除非它们的含义相同) 当程序运行时,枚举被保存为整数,而不是名称 然后,调试器从程序(4)中获取一个整数,并将其显示为可以找到的第一个枚举(4)。这只是为了调试时的方便-程序仍然使用整数(4)。我建议使用两个枚举作为suit和value: 然后执行扩展方法以获取实际卡值(因为
Jack
和Ace
都对应于11
):
最后
public class Card {
public Card (CardSuit suit, CardValue value) {
Suit = suit;
Value = value;
}
public CardSuit Suit {get; private set;}
public CardValue Value {get; private set;}
}
...
Card[] pack = Enum
.GetValues(typeof(CardSuit))
.OfType<CardSuit>()
.SelectMany(suit => Enum
.GetValues(typeof(CardValue))
.OfType<CardValue>()
.Select(value => new Card(suit, value)))
.ToArray();
//TODO: Shuffle the pack here
Card[] hand = pack.Take(5).ToArray();
int handValue = hand.Sum(card => card.Value.ActualValue());
公共类卡{
公共卡(CardSuit套装、CardValue){
西装=西装;
价值=价值;
}
公共卡套装{get;private set;}
公共CardValue{get;private set;}
}
...
卡片[]包装=枚举
.GetValues(类型(CardSuit))
第()类
.SelectMany(suit=>Enum
.GetValues(类型(CardValue))
第()类
.选择(值=>新卡(套装,值)))
.ToArray();
//TODO:在这里洗牌
卡片[]手=包.拿(5.ToArray();
int handValue=hand.Sum(card=>card.Value.ActualValue());
使用Enum.GetNames而不是Enum.GetValues似乎您需要两个枚举:一个用于西服(梅花..黑桃
),另一个用于值(Ace..King
)您的枚举将像这样工作,因为您使用了重复的值-之前有一篇关于卡片的帖子-家庭作业?你一定和这个家伙在同一个班里,可能会提到这个问题:我想OP希望集合说,例如,空格王牌(=1),梅花王牌(=1),等等。做一个Distinct()
只会显示13个值,这不是我们想要的。那时会有13条记录可用。
public static class ValueExtensions() {
public static int ActualValue(this CardValue value) {
if (value == CardValue.Ace)
return 11; // Ace is 11
else
return (int) value;
}
}
public class Card {
public Card (CardSuit suit, CardValue value) {
Suit = suit;
Value = value;
}
public CardSuit Suit {get; private set;}
public CardValue Value {get; private set;}
}
...
Card[] pack = Enum
.GetValues(typeof(CardSuit))
.OfType<CardSuit>()
.SelectMany(suit => Enum
.GetValues(typeof(CardValue))
.OfType<CardValue>()
.Select(value => new Card(suit, value)))
.ToArray();
//TODO: Shuffle the pack here
Card[] hand = pack.Take(5).ToArray();
int handValue = hand.Sum(card => card.Value.ActualValue());