C#中枚举类型的索引相当于什么?

4

假设我有以下枚举类型:

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(ranks) 这样的方式,但有没有一种方法可以获取 ranks 中的第 n 个项呢?比如用户输入了 4,我想将 rank 设置为第 4 个枚举,而不是显式地进行以下操作:

rank = ranks.four;

我该如何做呢?(针对这个例子,假设我必须使用枚举并且我知道还有其他更适合解决此问题的集合。)

谢谢你的帮助。:)


1
该枚举声明起始无效 - 您不能指定字符串值。 - Jon Skeet
那是我的第一个错误。现在对我来说很有意义。谢谢。 - Nate
这个问题可能会引起兴趣:在.Net中是否有内置的扑克牌库? - George Duckett
愿意接受那些在某种程度上符合你解决方案的答案。这会鼓励其他人来帮助你。 - Niranjan Singh
7个回答

8

(1) 命名规范:除非是可以组合在一起的“位标志”集合,否则不要将枚举名称复数化。

(2) 枚举中始终应包含一个值为零的项目。枚举的默认初始化将赋予它一个值为零,因此最好为它指定一个明确的名称(例如None)。

(3) 您可以将任何您喜欢的值强制转换为枚举,只要它与枚举的基础类型相同(默认情况下为int32)。

所以,您可以有一个像这样的枚举:

枚举 Rank { None, Ace, Two, ... }

并且要将从rank值为5转换为该枚举,您只需进行强制转换:

Rank rank = (Rank)5;

但最好编写一个方法来检查范围,然后抛出异常,以便进行转换。


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);
}

在您的GetRank()中,即使i不是Ranks中的值,也不会抛出异常。 - Matthew Watson
真的,宝宝在中途哭了起来,导致我提前结束了。现在已经解决了。 :-) - RJ Lohan

4

我不确定您想要做什么,但您发布的内容在C#世界中不是合法的枚举类型。
如果您有以下示例枚举:

  enum sample
    {
        ace = 1,
        two = 2,
        three = 3
    }

那么,您总是可以将任何int转换为此枚举(假设您确定值有效):

  int i = 3;
  sample mySample = (sample)i;

2

如果您的枚举值不是从0到X以1为增量连续运行的,那么您也可以执行以下操作:

var rank = (rank)Enum.GetValues(typeof(rank))[3];

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;
            }
    }

希望这有所帮助。

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));

0
基本上,枚举用于提供一些标准,告诉每个人可以使用哪些确切的值。但是,如果枚举值必须关心除了这个“标准”之外的某些信息-使用枚举不是一个好的实践。
考虑到您的情况“rank = ranks.four;”,我更喜欢使用具有常量字符串字段的类,而不是枚举。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接