相当于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));