enum

2009-05-13 18 views
227

में परिभाषित वस्तुओं की कुल संख्या मैं enum में परिभाषित वस्तुओं की संख्या कैसे प्राप्त कर सकता हूं?enum

उत्तर

304

आप स्थिर विधि Enum.GetNames का उपयोग कर सकते हैं जो enum में सभी आइटमों के नाम का प्रतिनिधित्व करने वाला एक सरणी देता है। इस सरणी की लंबाई संपत्ति enum

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length; 
+0

सहमत ... यहां एक लिंक है जो मैंने पाया http://www.csharp411.com/c-count-items-in-an-enum/ –

+5

Enum.GetValues ​​का भी उपयोग कर सकता है। – Xonatron

+0

System.Enum.GetNames, यदि आप पहले से ही सिस्टम नेमस्पेस समेत नहीं हैं। –

67

Enum.GetValues (टाइपोफ (माईएनम))। लंबाई;

+2

यह GetNames विधि का उपयोग करने के लिए तेजी से है। –

+0

क्या परिणाम उपयोगिता वर्ग में कैश किए जाने चाहिए? – djmj

+1

मैंने इसे वापस घुमाया - अन्यथा यह स्वीकृत उत्तर का एक कम उपयोगी संस्करण है। – Flexo

5

आप Enum.GetNames का उपयोग अपने enum में मानों के एक आईनेमरेबल को वापस करने के लिए कर सकते हैं और उसके बाद परिणामी IENumerable।

GetNames GetValues ​​के समान परिणाम उत्पन्न करता है लेकिन तेज़ है।

6

पिछले उत्तरों से कोड नमूना जोड़ने में परिभाषित वस्तुओं की संख्या के बराबर होती है।

class Program 
    { 
     static void Main(string[] args) 
     { 
      int enumlen = Enum.GetNames(typeof(myenum)).Length; 
      Console.Write(enumlen); 
      Console.Read(); 
     } 
     public enum myenum 
     { 
      value1, 
      value2 
     } 
    } 
9

एक गंधा चाल मैं इस सवाल का एक सी जवाब में देखा था, बस enum करने के लिए एक पिछले तत्व जोड़ सकते हैं और इसका इस्तेमाल को बताने के लिए कि कितने तत्वों enum में हैं:

enum MyType { 
    Type1, 
    Type2, 
    Type3, 
    NumberOfTypes 
} 

में मामला जहां आप 0 के अलावा प्रारंभ मूल्य को परिभाषित कर रहे हैं, आप तत्वों की संख्या का पता लगाने के लिए NumberOfTypes - Type1 का उपयोग कर सकते हैं।

मुझे यकीन नहीं है कि यह विधि एनम का उपयोग करने से तेज होगी, और मुझे यह भी सुनिश्चित नहीं है कि इसे करने का उचित तरीका माना जाएगा, क्योंकि हमारे पास एनम हमारे लिए यह जानकारी सुनिश्चित करने के लिए है।

+0

यह अच्छा है क्योंकि मैं इसे एक्सएनए पर कर सकता हूं क्योंकि GetNames उपलब्ध नहीं है –

+0

कूल चाल, यह GetNames() से भी तेज होगा क्योंकि इसे गिनना नहीं है। –

+3

फ़ोरैच के माध्यम से enums के माध्यम से चक्र के बारे में सावधान रहें - आप अपने सरणी के अंत को पढ़ सकते हैं! –

140

सवाल यह है:

मैं एक enum में परिभाषित मदों की संख्या कैसे मिल सकता है?

"आइटम" की संख्या वास्तव में दो पूरी तरह से अलग चीज़ें हो सकती है। निम्नलिखित उदाहरण पर विचार करें।

enum MyEnum 
{ 
    A = 1, 
    B = 2, 
    C = 1, 
    D = 3, 
    E = 2 
} 

MyEnum में परिभाषित "आइटम" की संख्या क्या है?

आइटम की संख्या 5 है? (A, B, C, D, E)

या यह 3 है? (1, 2, 3)

नामMyEnum में परिभाषित की संख्या (5) की गणना इस प्रकार किया जा सकता है।

var namesCount = Enum.GetNames(typeof(MyEnum)).Length; 

मूल्योंMyEnum में परिभाषित (3) की गणना इस प्रकार किया जा सकता है की संख्या।

var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count(); 
+16

पर सीधे एनम बाइंडिंग से सावधान रहें, इसे शीर्ष पर वोट दिया जाना चाहिए। – Xonatron

+1

अंतिम पंक्ति लिखने का वैकल्पिक तरीका, 'var valuesCount = ((MyEnum []) Enum.GetValues ​​(typeof (MyEnum))। अलग()। गणना(); '। –

3

विजुअल बेसिक के लिए:

[Enum].GetNames(typeof(MyEnum)).Length मेरे साथ काम नहीं किया है, लेकिन [Enum].GetNames(GetType(Animal_Type)).length किया था।

+0

डाउनवोट क्यों? यह मेरी समस्या को ठीक करता है, यह वीबी के लिए सही वाक्यविन्यास है, भले ही सवाल सी # टैग किया गया हो, फिर भी उपयोगी है। –

+0

शायद डाउनवोट्स क्योंकि प्रश्न सी # टैग किया गया है और इस उत्तर में यह उल्लेख नहीं किया गया था कि यह सी # का उपयोग नहीं कर रहा था। – idbrii

-1

मैं अभी इस पर देख रहा था, और वर्तमान समाधान की पठनीयता से खुश नहीं था। यदि आप अनौपचारिक रूप से या एक छोटी परियोजना पर कोड लिख रहे हैं, तो आप केवल "लंबाई" नामक अपने enum के अंत में एक और आइटम जोड़ सकते हैं। इस तरह, आप केवल लिखना होगा: अगर दूसरों को अपने कोड का उपयोग करने जा रहे हैं

var namesCount = (int)MyEnum.Length; 
बेशक

- या मैं कई अन्य परिस्थितियों में यह सुनिश्चित करें कि इस मामले में मेरे लिए लागू नहीं किया था हूँ - इस समाधान हो सकता है बीमार से कहीं भी भयानक होने की सलाह दीजिए।

+1

यह भी 0 से शुरू होने वाले enum पर निर्भर करता है (डिफ़ॉल्ट, लेकिन किसी भी तरह से गारंटी नहीं है)। इसके अतिरिक्त, यह सामान्य enum उपयोग * बहुत * उलझन में intellisense बनाता है। यह लगभग हमेशा एक ** भयानक ** विचार है। – BradleyDotNET

+1

इसमें लंबा समय नहीं लगा :) – EnergyWasRaw

+1

दिलचस्प, मुझे लगता है कि आप कभी नहीं जानते कि कुछ बेहतर हो सकता है। मैंने अपने स्वयं के समाधान को चकित करने का अपना सर्वश्रेष्ठ प्रयास किया, लेकिन इसे साझा करने के लिए काफी रोचक पाया! – EnergyWasRaw

2

यदि आप पाते हैं अपने आप को जितनी बार मैं तो आप इसे एक सामान्य रूप में लागू कर सकता है, जैसा कि ऊपर समाधान लेखन:

public static int GetEnumEntries<T>() where T : struct, IConvertible 
{ 
    if (!typeof(T).IsEnum) 
     throw new ArgumentException("T must be an enumerated type"); 

    return Enum.GetNames(typeof(T)).Length; 
}