किसी एनम में परिभाषित वस्तुओं की कुल संख्या


जवाबों:


430

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

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

1
सहमत ... यहाँ मुझे एक लिंक मिला है csharp411.com/c-count-items-in-an-enum
SO उपयोगकर्ता

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

6
System.Enum.GetNames, यदि आप सिस्टम नामस्थान पहले से शामिल नहीं हैं।
ब्रेट पेनिंग्स

4
इसलिए मैंने आज फिर से इस समस्या का सामना किया; सी स्टाइल ट्रिक जैसा कि नीचे दिए गए अन्य उत्तरों में वर्णित है, को समस्याग्रस्त होने के रूप में सूचीबद्ध किया गया है, लेकिन Enum.GetValues ​​और Enum.GetNames दोनों को ऊपर सूचीबद्ध किया गया है, ऐसा लगता है जैसे वे एक निश्चित लंबाई पाने के लिए एक पूरी नई सरणी आवंटित करते हैं, जो अच्छी तरह से ... , भयानक। किसी को पता है कि क्या यह दृष्टिकोण वास्तव में गतिशील आवंटन को प्रभावित करता है? यदि ऐसा है, तो कुछ उपयोग के मामलों के लिए यह सबसे दूर का समाधान है और सबसे अधिक लचीला समाधान नहीं तो सबसे अधिक लचीला।
J Trana

174

प्रश्न है:

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

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

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

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

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

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

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

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

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

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

2
अंतिम पंक्ति लिखने का वैकल्पिक तरीका var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();,।
जेपी स्टिग नीलसन

3
मैं किसी भी डेवलपर के बारे में नहीं सोच सकता जो मैंने अपने जीवन में कभी मिला हो जो इस बात की पुष्टि करता हो कि इस तरह की एनम में 3 आइटम हैं।
motoDrizzt

2
@ motoDrizzt आप एक प्रिंटर ड्राइवर की तरह इनम पर कुछ ऐसा पा सकते हैं Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...;)।
shA.t


14

इस प्रश्न के उत्तर में मैंने देखा कि एक निफ्टी ट्रिक, बस एनम में एक अंतिम तत्व जोड़ें और इसका उपयोग यह बताने के लिए करें कि एनम में कितने तत्व हैं:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

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

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


1
यह अच्छा है क्योंकि मैं XNA पर ऐसा कर सकता हूं क्योंकि GetNames वहां उपलब्ध नहीं है
थियागो वैले

शांत चाल, यह भी GetNames () की तुलना में तेज़ होगा क्योंकि इसे उन्हें गिनना नहीं है।
जॉर्डन लाएप्राइज

4
कोड के बारे में सावधान रहें जो forums के माध्यम से enums के माध्यम से साइकिल करता है - आप अपने सरणियों के अंत में पढ़ सकते हैं!
माइकल डोरगन

4
इसके अलावा, उन दुश्मनी से सावधान रहें जो अपने स्वयं के मूल्यों को परिभाषित करते हैं - मैं अक्सर बिट्स के झंडे के लिए Enums का उपयोग करता हूं।
मैट पार्किंस


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
        }
    }

5

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

GetNames GetValues ​​के समान ही परिणाम देता है, लेकिन तेज़ होता है।


5

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

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;
}

1

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

var namesCount = (int)MyEnum.Length;

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


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

2
यह लंबे समय तक नहीं लिया :)
EnergyWasRaw

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

1

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

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


क्यों होता है पतन? इसने मेरी समस्या को ठीक कर दिया, यह VB के लिए सही वाक्यविन्यास है, भले ही प्रश्न को # टैग किया गया हो, फिर भी उपयोगी है।
एम ग्रांजा

2
डाउनवोट्स शायद इसलिए क्योंकि प्रश्न C # को टैग किया गया है और इस उत्तर में यह उल्लेख नहीं किया गया है कि यह C # का उपयोग नहीं कर रहा था।
इडबरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.