相当于c#中枚举类型的索引?
假设我有以下枚举类型:相当于c#中枚举类型的索引?,c#,enums,indexing,C#,Enums,Indexing,假设我有以下枚举类型: 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; 我知道我可以做像siz
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;
我该怎么做
(在本例中,假设我必须使用enum,并且我知道还有其他集合更适合此问题。)
谢谢你的帮助。:) 我不知道你想做什么,但是你发布的内容在c#世界里不是合法的。
如果您有以下示例枚举:
enum sample
{
ace = 1,
two = 2,
three = 3
}
然后,您可以始终将任何int强制转换到此枚举(假设您确定该值有效):
如前所述,您的enum声明是无效的,但您想要做的可能更像
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为增量从0到X顺序运行,则还可以执行以下操作:
var rank = (rank)Enum.GetValues(typeof(rank))[3];
您可以在枚举中指定整数值,这将帮助您获取自定义值以标识其位置 选中此项:
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;
}
}
int position=EnumUtil.GetEnumIndex(排名4);
//
公共静态类EnumUtil
{
公共静态整型GetEnumIndex(T值)
{
int指数=-1;
int itemIndex=0;
foreach(Enum.GetValues(typeof(T)).Cast()中的T项)
{
如果(项目等于(值))
{
索引=项目索引+1;
打破
}
itemIndex++;
}
收益指数;
}
}
希望此帮助枚举值必须是数字,但您可以为其添加说明:
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));
(1) 命名约定:不要对枚举的名称进行多元化,除非它是一组可以一起进行或运算的“位标志”
(2) 枚举中始终有一个值为零的项。枚举的默认初始化将使其值为零,因此最好为其指定一个明确的名称(例如None)
(3) 您可以将任何喜欢的值强制转换为枚举,前提是该值与枚举的基础类型相同(默认情况下为int32)
因此,您可以有一个如下所示的枚举:
枚举秩
{
没有一个
王牌
二,,
...
}
要将秩值(例如5)转换为枚举,您只需强制转换:
秩秩=(秩)5
但是您最好编写一个方法,以便在强制转换之前检查范围,如果超出范围,则抛出异常。基本上使用枚举来提供一些标准,告诉每个人可以使用哪些exsacly值。但是,如果枚举值必须关心除此“标准”之外的一些信息,那么使用枚举并不是一种好的做法
考虑到“rank=ranks.four”的情况,我更喜欢使用带有常量字符串字段的类,而不是Enum。该Enum声明一开始是无效的-不能指定字符串值。这是我的第一个错误。现在对我来说有意义了。谢谢。这个问题可能很有意思:介意接受一些适合你的答案吗。这会鼓励其他人帮助你..在你的GetRank()中,即使我不是排名中的一个值,也不会抛出异常。没错,宝贝在中途哭了,而我过早地结束了。现在已修复。:-)
Console.WriteLine(GetRankName((ranks)4));