相当于c#中枚举类型的索引?

时间:2012-05-25 08:13:09

标签: 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;

我知道我可以做像sizeof(排名)之类的事情但是有没有办法在排名中获得第n项?假设用户输入4并且我想将排名设置为第4个枚举而不明确地执行:

rank = ranks.four;

我该怎么做?

(出于这个例子的目的,假设我必须使用枚举,并且我知道还有其他集合更适合这个问题。)

感谢您的帮助。 :)

7 个答案:

答案 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。