2012-05-25 69 views
4

說我有以下枚舉類型:等同於c#中枚舉類型的索引?

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; 

我怎樣才能做到這一點?

(在這個例子的目的,假設我必須用枚舉,而且我知道有其他收藏品更適合這個問題。)

感謝您的幫助。 :)

+1

該枚舉聲明是無效的開始 - 你不能指定字符串值。 –

+0

這是我的第一個錯誤。現在對我有意義。謝謝。 – Nate

+0

這個問題可能是有趣的:[在.Net中是否有內置的撲克牌庫?](http://stackoverflow.com/q/931322) –

回答

7

(1)命名約定:除非是一組可以一起使用的「比特標誌」,否則不要將枚舉的名稱多元化。(2)在枚舉中始終有一個值爲零的項目。枚舉的默認初始化將賦值爲零,因此最好爲其指定一個明確的名稱(例如None)。 (3)您可以將任何您喜歡的值轉換爲枚舉,只要它與枚舉的基礎類型(默認爲int32)相同即可。

所以,你可以有一個看起來像這樣的枚舉:

枚舉排名 { 無, 王牌, 二, ... }

,並從的等級值轉換,例如,5,對於枚舉,您可以只投:

排名等級=(等級)5;

但是你最好寫一個方法來在投射前檢查範圍,如果超出範圍則拋出異常。

4

林不知道你在做什麼,但你張貼的是不是在C#世界的法律枚舉。
如果你有下面的示例枚舉:

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

那麼你可以隨時施放任何INT於此枚舉(假設你是確保該值有效):

int i = 3; 
    sample mySample = (sample)i; 
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); 
} 
+0

在你的GetRank()中,即使我不是Rank中的值,也不會拋出異常。 –

+0

的確,寶寶開始哭泣,我過早完成了。現在修復。 :-) –

2

如果你的枚舉值不按順序從0增量爲1運行X,那麼你也可以做到以下幾點:

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

基本枚舉用於提供一些標準,告訴大家可以使用什麼exsacly值。但是,如果枚舉值必須關注除「這種」標準之外的一些信息 - 使用枚舉不是好習慣。考慮到你的情況「rank = ranks.four;」我希望使用具有常量字符串字段的Class而不是Enum。