2009-01-27 16 views
99

मैं निम्नलिखित कोड है:सी # एक enum के माध्यम से Iterating? (एक System.Array अनुक्रमण)

// Obtain the string names of all the elements within myEnum 
String[] names = Enum.GetNames(typeof(myEnum)); 

// Obtain the values of all the elements within myEnum 
Array values = Enum.GetValues(typeof(myEnum)); 

// Print the names and values to file 
for (int i = 0; i < names.Length; i++) 
{ 
    print(names[i], values[i]); 
} 

हालांकि, मैं नहीं सूचक मान सकते हैं। क्या इसे करने का कोई आसान रास्ता है?

या क्या मैंने पूरी तरह से कुछ याद किया है!

+0

आप [इन्स और बहिष्कार सी # enums की] (http://www.codeducky.org/ins-outs-c-enums/) है, जो वर्णन करता है की जाँच करने के लिए चाहते हो सकता है कि कैसे प्राप्त करने के लिए एक IEnumerable टाइप किया GetValues ​​() और Cast() – ChaseMedallion

उत्तर

179
Array values = Enum.GetValues(typeof(myEnum)); 

foreach(MyEnum val in values) 
{ 
    Console.WriteLine (String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val)); 
} 

या, आप System.Array कि लौटा दिया जाता है डाली कर सकते हैं:

string[] names = Enum.GetNames(typeof(MyEnum)); 
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum)); 

for(int i = 0; i < names.Length; i++) 
{ 
    print(names[i], values[i]); 
} 

लेकिन, आप यह सुनिश्चित करें कि GetValues ​​उसी क्रम GetNames नाम रिटर्न के रूप में में मान देता है हो सकता है?

+3

"लेकिन, क्या आप यह सुनिश्चित कर सकते हैं कि GetValues ​​उसी क्रम में मान देता है जैसे GetNames नाम लौटाता है?" - यह एक बहुत अच्छा मुद्दा है और कुछ जिसे मैंने अभी तक संबोधित किया है! मुझे लगता है कि आपका पहला समाधान शायद मूल्यों और तारों से मेल खाने का तरीका प्रदान करेगा –

+0

हैलो, मैंने ऐसा करते समय "इंडेक्स-मिस्चैचिंग" के इस संदेह से पहले उल्लेख किया है; हालांकि, मुझे अभी तक यह पता लगाना है कि यह वास्तव में चिंता का विषय है या नहीं? क्या कोई निश्चित मामला है जिससे यह धारणा भयानक हो सकती है? धन्यवाद! – Funka

+0

यदि आप 'Enum.GetName (typeof (MyEnum), val), (int) वैल) के रूप में मान विसंगति का निवारण करना चाहते हैं, तो आप शायद दूसरे "वैल" को int में डालना चाहते हैं) जिसमें आउटपुट गणना प्रदान करता है नाम और संख्या। – Greg

3

फ़ोरैच लूप का उपयोग करने के बारे में क्या, शायद आप इसके साथ काम कर सकते हैं?

int i = 0; 
    foreach (var o in values) 
    { 
    print(names[i], o); 
    i++; 
    } 

शायद ऐसा कुछ?

+0

का उपयोग करके मैंने उस पर ध्यान दिया है ... लेकिन मुझे 'सिंक' में दोनों नामों और मानों तक पहुंच प्राप्त करने की आवश्यकता है ... कहें नाम [2] मूल्यों के साथ जोड़ा गया है [2] और मैं निश्चित नहीं हूं कि इसे फोरच लूप में कैसे प्राप्त किया जाए! –

+0

मैंने एक उदाहरण जोड़ा है - देखें कि क्या इससे मदद मिलती है। – TWith2Sugars

30

आप सरणी कास्ट करने के लिए की जरूरत है - लौटे सरणी, का अनुरोध प्रकार के वास्तव में है यानी myEnum[] अगर आप typeof(myEnum) के लिए पूछना:

myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum)); 

फिर values[0] आदि

8

आप अलग अलग करने के लिए है कि सरणी डाल सकता सरणी के प्रकार:

0123:

myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum)); 

या आप पूर्णांक मूल्यों चाहते हैं

int[] values = (int[])Enum.GetValues(typeof(myEnum)); 

आप निश्चित रूप से उन casted सरणियों :) पुनरावृति कर सकते हैं

6

कैसे एक शब्दकोश सूची के बारे में?

Dictionary<string, int> list = new Dictionary<string, int>(); 
foreach(var item in Enum.GetNames(typeof(MyEnum))) 
{ 
    list.Add(item, (int)Enum.Parse(typeof(MyEnum), item)); 
} 

और निश्चित रूप से आप शब्दकोश मूल्य प्रकार को बदल सकते हैं जो आपके एनम मान हैं।

+0

मुझे लगता है कि यह जाने का रास्ता होगा, लेकिन असुविधाजनक रूप से enum कोड के उस क्षेत्र में है जिसका मेरा कोई नियंत्रण नहीं है! –

2

ऐरे में GetValue (Int32) विधि है जिसका उपयोग आप निर्दिष्ट सूचकांक पर मान पुनर्प्राप्त करने के लिए कर सकते हैं।

Array.GetValue

0

यहाँ Enum वस्तु अपने कस्टम के माध्यम से पुनरावृति करने के लिए

For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum)) 

    Print([Enum].GetName(GetType(MyEnum), enumValue).ToString) 

Next 
+1

मुझे लगता है कि ओपी ने सी # के लिए कहा था। –

4

यहाँ है एक और आसान तरीका है। हमें हमारे EnumValues ​​के लिए दोस्ताना नाम प्रदान करने की आवश्यकता थी। हमने प्रत्येक enum मान के लिए कस्टम स्ट्रिंग मान दिखाने के लिए System.ComponentModel.DescriptionAttribute का उपयोग किया।

public static class StaticClass 
{ 
    public static string GetEnumDescription(Enum currentEnum) 
    { 
     string description = String.Empty; 
     DescriptionAttribute da; 

     FieldInfo fi = currentEnum.GetType(). 
        GetField(currentEnum.ToString()); 
     da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, 
        typeof(DescriptionAttribute)); 
     if (da != null) 
      description = da.Description; 
     else 
      description = currentEnum.ToString(); 

     return description; 
    } 

    public static List<string> GetEnumFormattedNames<TEnum>() 
    { 
     var enumType = typeof(TEnum); 
     if (enumType == typeof(Enum)) 
      throw new ArgumentException("typeof(TEnum) == System.Enum", "TEnum"); 

     if (!(enumType.IsEnum)) 
      throw new ArgumentException(String.Format("typeof({0}).IsEnum == false", enumType), "TEnum"); 

     List<string> formattedNames = new List<string>(); 
     var list = Enum.GetValues(enumType).OfType<TEnum>().ToList<TEnum>(); 

     foreach (TEnum item in list) 
     { 
      formattedNames.Add(GetEnumDescription(item as Enum)); 
     } 

     return formattedNames; 
    } 
} 

उपयोग

में
public enum TestEnum 
{ 
     [Description("Something 1")] 
     Dr = 0, 
     [Description("Something 2")] 
     Mr = 1 
} 



    static void Main(string[] args) 
    { 

     var vals = StaticClass.GetEnumFormattedNames<TestEnum>(); 
    } 

यह "कुछ 1", लौटने खत्म हो जाएगा "कुछ 2"

+0

विवरण केवल स्थिर हैं यदि विवरण स्थिर हैं ... यदि आपके विवरण को आवृत्ति के आधार पर बदलने की आवश्यकता है तो यह दृष्टिकोण काम नहीं करेगा। – Llyle

4

एक अन्य समाधान, दिलचस्प संभावनाओं के साथ:

enum Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 

static class Helpers 
{ 
public static IEnumerable<Days> AllDays(Days First) 
{ 
    if (First == Days.Monday) 
    { 
    yield return Days.Monday; 
    yield return Days.Tuesday; 
    yield return Days.Wednesday; 
    yield return Days.Thursday; 
    yield return Days.Friday; 
    yield return Days.Saturday; 
    yield return Days.Sunday; 
    } 

    if (First == Days.Saturday) 
    { 
    yield return Days.Saturday; 
    yield return Days.Sunday; 
    yield return Days.Monday; 
    yield return Days.Tuesday; 
    yield return Days.Wednesday; 
    yield return Days.Thursday; 
    yield return Days.Friday; 
    } 
} 
+2

मानसिक नोट: उपज का अधिक उपयोग करें –

2

आप को आसान बनाने में कर सकते हैं यह प्रारूप तारों का उपयोग कर। मैं उपयोग संदेशों में निम्न स्निपेट का उपयोग करता हूं:

writer.WriteLine("Exit codes are a combination of the following:"); 
foreach (ExitCodes value in Enum.GetValues(typeof(ExitCodes))) 
{ 
    writer.WriteLine(" {0,4:D}: {0:G}", value); 
} 

डी प्रारूप विनिर्देश एनम मान को दशमलव के रूप में स्वरूपित करता है। एक एक्स विनिर्देशक भी है जो हेक्साडेसिमल आउटपुट देता है।

जी विनिर्देशक एक स्ट्रिंग के रूप में एक enum प्रारूपित करता है। यदि ध्वज विशेषता enum पर लागू होती है तो संयुक्त मान भी समर्थित होते हैं। एक एफ विनिर्देशक है जो काम करता है जैसे झंडे हमेशा मौजूद होते हैं।

Enum.Format() देखें।

3

पुराना सवाल है, लेकिन एक से थोड़ा क्लीनर दृष्टिकोण LINQ के .Cast<>()

var values = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); 

foreach(var val in values) 
{ 
    Console.WriteLine("Member: {0}",val.ToString());  
} 
2

Enum.GetValues ​​परिणामों में उपयोग करते हुए, पूर्णांक के लिए कास्टिंग संख्यात्मक मान पैदा करता है। ToString का उपयोग करना() दोस्ताना नाम पैदा करता है। Enum.GetName को कोई अन्य कॉल की आवश्यकता नहीं है।

public enum MyEnum 
{ 
    FirstWord, 
    SecondWord, 
    Another = 5 
}; 

// later in some method 

StringBuilder sb = new StringBuilder(); 
foreach (var val in Enum.GetValues(typeof(MyEnum))) { 
    int numberValue = (int)val; 
    string friendyName = val.ToString(); 
    sb.Append("Enum number " + numberValue + " has the name " + friendyName + "\n"); 
} 
File.WriteAllText(@"C:\temp\myfile.txt", sb.ToString()); 

// Produces the output file contents: 
/* 
Enum number 0 has the name FirstWord 
Enum number 1 has the name SecondWord 
Enum number 5 has the name Another 
*/ 
संबंधित मुद्दे