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) 命名規則: 一緒に ored できる「ビット フラグ」のセットでない限り、enum の名前を複数形にしないでください。

(2) 値が 0 の列挙型には常に項目があります。列挙型のデフォルトの初期化では値が 0 になるため、明示的な名前 (None など) を付けるのが最善です。

(3) 列挙型の基になる型 (デフォルトでは int32) と同じであれば、任意の値を列挙型にキャストできます。

したがって、次のような列挙型を使用できます。

enum ランク { なし、エース、2、... }

たとえば、5 のランク値から列挙型に変換するには、次のようにキャストするだけです。

ランクランク=(ランク)5;

ただし、キャストする前に範囲をチェックし、範囲外の場合は例外をスローするメソッドを作成することをお勧めします。

于 2012-05-25T08:34:48.790 に答える
7

前述のように、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);
}
于 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;"私は列挙型の代わりに定数文字列フィールドでクラスを使用することを好みます。

于 2012-05-25T08:56:50.180 に答える