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) 之类的事情,但是有没有办法让排名中的第 n 个项目?假设用户输入 4 并且我想将排名设置为第 4 个枚举而不明确执行:

rank = ranks.four;

我怎样才能做到这一点?

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

谢谢您的帮助。:)

4

7 回答 7

8

(1) 命名约定:不要将枚举的名称复数,除非它是一组可以组合在一起的“位标志”。

(2) 在枚举中总是有一个值为零的项目。枚举的默认初始化将给它一个零值,因此最好为它有一个明确的名称(例如无)。

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

所以你可以有一个看起来像这样的枚举:

枚举排名{无,王牌,二,...}

并且要从 5 的等级值转换为枚举,您可以强制转换:

排名rank = (Rank)5;

但是您最好编写一个方法来检查范围,然后在转换之前检查范围,如果超出范围则抛出异常。

于 2012-05-25T08:34:48.790 回答
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);
}
于 2012-05-25T08:20:02.833 回答
4

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

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

那么您可以随时将任何 int 转换为该枚举(假设您确定该值有效):

  int i = 3;
  sample mySample = (sample)i;
于 2012-05-25T08:17:50.620 回答
2

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

var rank = (rank)Enum.GetValues(typeof(rank))[3];
于 2012-05-25T08:20:17.437 回答
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;
            }
    }

希望这有帮助

于 2012-05-25T08:21:54.873 回答
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));
于 2012-05-25T08:31:30.617 回答
0

基本上,枚举用于提供一些标准,告诉每个人可以使用哪些 exsacly 值。但是,如果枚举值必须关心除此“标准”之外的一些信息 - 使用枚举不是一个好习惯。

考虑到您的情况“rank = ranks.four;”,我更喜欢使用带有常量字符串字段的 Class 而不是 Enum。

于 2012-05-25T08:56:50.180 回答