说我有以下枚举类型:
private enum ranks { ace = "Ace", two = "2", three = "3", four = "4", five = "5", six = "6", seven = "7",
eight = "8", nine = "9", ten = "10", jack = "Jack", queen = "Queen", king = "King" }
ranks rank;
我知道我可以做像sizeof(排名)之类的事情但是有没有办法在排名中获得第n项?假设用户输入4并且我想将排名设置为第4个枚举而不明确地执行:
rank = ranks.four;
我该怎么做?
(出于这个例子的目的,假设我必须使用枚举,并且我知道还有其他集合更适合这个问题。)
感谢您的帮助。 :)
答案 0 :(得分:7)
如上所述,您的枚举声明无效,但也许您想要做的更像是;
private enum Ranks
{
Ace = 1,
Two = 2,
Three = 3,
. . .
Jack = 11,
Queen = 12,
King = 13
}
public void SomeMethod()
{
Ranks rank = Ranks.Jack;
int rankValue = (int)rank;
string rankName = rank.ToString();
}
public Ranks GetRank(int i)
{
string name = Enum.GetName(typeof (Ranks), i);
if (null == name) throw new Exception();
return (Ranks)Enum.Parse(typeof (Ranks), name);
}
答案 1 :(得分:7)
(1)命名约定:不要将枚举的名称复数,除非它是一组可以一起存储的“位标志”。
(2)枚举中始终有一个值为零的项目。枚举的默认初始化将使其值为零,因此最好有一个明确的名称(例如,无)。
(3)您可以将任何您喜欢的值强制转换为枚举,只要它与枚举的基础类型(默认情况下为int32)相同。
所以你可以有一个看起来像这样的枚举:
enum Rank { 没有, 高手, 二, ... }
并且从等级值5转换为枚举,你可以直接转换:
等级排名=(等级)5;
但是你最好编写一个方法来执行此操作,以便在转换之前检查范围,并在超出范围时抛出异常。
答案 2 :(得分:4)
我不确定你要做什么,但你发布的内容不是c#世界的合法枚举。
如果您有以下示例枚举:
enum sample
{
ace = 1,
two = 2,
three = 3
}
然后你总是可以将任何int强制转换为这个枚举(假设你确定该值是有效的):
int i = 3;
sample mySample = (sample)i;
答案 3 :(得分:2)
如果您的枚举值不是以0为增量从0到X顺序运行,那么您还可以执行以下操作:
var rank = (rank)Enum.GetValues(typeof(rank))[3];
答案 4 :(得分:2)
您可以在枚举中指定整数值,以帮助您获取自定义值以识别其位置。
检查一下:
void Main()
{
int rank = (int)ranks.two;
Console.WriteLine(rank);
ranks rankEnum = (ranks)2;
Console.WriteLine(rankEnum.ToString());
}
private enum ranks
{ ace = 1, two = 2, three = 3, four = 4, five = 5, six = 6, seven = 7,
eight = 8, nine = 9, ten = 10 }
//输出
2
two
您可以将枚举的索引作为:
int position = EnumUtil.GetEnumIndex<ranks>(ranks.four);
//
public static class EnumUtil
{
public static int GetEnumIndex<T>(T value)
{
int index = -1;
int itemIndex = 0;
foreach (T item in Enum.GetValues(typeof(T)).Cast<T>())
{
if (item.Equals(value))
{
index = itemIndex + 1;
break;
}
itemIndex ++;
}
return index;
}
}
希望这个帮助
答案 5 :(得分:1)
枚举值必须是数字,但您可以为它们添加说明:
private enum ranks {
[Description("Ace")] ace = 1,
two = 2,
three = 3,
four = 4,
five = 5,
six = 6,
seven = 7,
eight = 8,
nine = 9,
ten = 10,
[Description("Jack")] jack = 11,
[Description("Queen")] queen = 12,
[Description("King")] king = 13
}
现在您可以将任何整数值转换为枚举值:
(ranks)4
您可以使用此功能获取说明或排名:
private static string GetRankName(ranks rank) {
FieldInfo fi = typeof(ranks).GetField(rank.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0) {
return attributes[0].Description;
} else {
return ((int)rank).ToString();
}
}
用法:
Console.WriteLine(GetRankName((ranks)4));
答案 6 :(得分:0)
基本枚举用于提供一些标准,告诉每个人可以使用哪些exsacly值。但是,如果枚举值必须关注除了“标准”之外的一些信息 - 使用枚举并不是一种好的做法。
考虑你的情况“rank = rank.four;”我更喜欢使用带有常量字符串字段的Class而不是Enum。