2011-02-11 16 views
10

चलो कहते हैं कि मैं इस enum करते हैं: पहला enum मैं बस यह कर सकते हैं के मूल्यों के माध्यम सेकैसे जटिल enum मूल्य स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए

SomeType easyType = SomeType.Val1 | SomeType.Val2; 
SomeType complexType = SomeType.All; 

अगर मैं लूप करना चाहते हैं:

[Flags] 
public enum SomeType 
{  
    Val1 = 0, 
    Val2 = 1, 
    Val3 = 2, 
    Val4 = 4, 
    Val5 = 8, 
    Val6 = 16, 
    All = Val1 | Val2 | Val3 | Val4 | Val5 | Val6 
} 

और कुछ चर कार्य करें:

foreach(string s in easyType.ToString().Split(',')) 
{ ... } 

हालांकि, जब मैं 'complexType' मैं मूल्य प्राप्त 'सभी', निश्चित रूप से है जो करने के लिए एक ही दृष्टिकोण लागू करने का प्रयास मान्य क्योंकि यह enum के संभावित मूल्यों में से एक भी है। लेकिन, क्या वास्तव में यह देखने का एक साफ तरीका है कि कुछ प्रकार क्या मूल्य हैं। सभी का निर्माण? मैं जानता हूँ कि मैं उस तरह सभी मूल्यों के माध्यम से एक मैनुअल पाश बना सकता है:

if(complexType.HasFlag(ManualType.Val1) && ... 
+0

मुझे लगता है कि समस्या यह है कि आप इस enum के अंदर नहीं रखना चाहिए 'All' है। चूंकि आप इसे '[ध्वज]' चिह्नित करते हैं, इसलिए इसमें कोई संयोजन रखना बुरा विचार है। –

+0

तो मैं (और अन्य) हमेशा जब कुछ के लिए SomeType का उपयोग कर enums के समुचित संयोजन का उपयोग करने के लिए याद करने के लिए होगा। – IamDeveloper

+0

क्या आप व्यर्थ 'कुछ प्रकार' के बजाय मूल enum पोस्ट कर सकते हैं? –

उत्तर

4
var result = string.Join(",", 
       Enum.GetValues(typeof(SomeType)) 
        .Cast<SomeType>() 
        .Where(v => complexType.HasFlag(v))); 

आप एक विस्तार लिख सकते हैं खुद को दोहराने से बचने के लिए विधि।

+1

क्या इसमें अंत में ", सभी" भी शामिल नहीं होगा? क्या इसे अनदेखा करने के लिए एक विशेष मामले की आवश्यकता है? – Justin

+0

@ जस्टिन: हाँ यह होगा। लेकिन हम क्या कर सकते हैं? जांचें कि यह "सब" है या नहीं? क्या होगा यदि इसका नाम "ऑलऑप्शन" है? इसलिए हम इस "विशेष मामले" से निपट नहीं सकते हैं। –

+0

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

0

शायद तुम enum मूल्यों की गणना और परीक्षण की आवश्यकता हर एक:

foreach (SomeType item in Enum.GetValues (typeof (SomeType)) 
{ 
    if ((complexType & item) == item) 
    { 
    //... 
    } 
} 
+0

लेकिन फिर मैं सभी के लिए भी परीक्षण करूंगा। यह मेरी स्थिति में ठीक है, लेकिन अगर मैं कुछ टाइप टाइप भी करूँगा। जस्ट थ्री = वैल 1 | वैल 2 | वैल 3। यह कम से कम अनावश्यक है। – IamDeveloper

0

यहाँ यह करने के लिए एक संभव तरीका है, डैनी चेन के जवाब पर निर्माण:

public IEnumerable<T> GetFlags<T>(Predicate<int> hasFlag) 
{ 
    return GetEnumFlags<T>().Where(f => hasFlag(f)).Cast<T>(); 
} 

private IEnumerable<int> GetEnumFlags<T>() 
{ 
    return Enum.GetValues(typeof(T)).Cast<int>().Where(IsPowerOfTwoOrZero); 
} 

private bool IsPowerOfTwoOrZero(int v) 
{ 
    return ((v & (v-1)) == 0); 
} 

उपयोग:

void Main() 
{ 
    SomeType easyType = SomeType.Val1 | SomeType.Val2; 
    SomeType complexType = SomeType.All; 

    GetFlags<SomeType>(v => easyType.HasFlag((SomeType)v)); 
    GetFlags<SomeType>(v => complexType.HasFlag((SomeType)v)); 
} 

नोट इस int को castable प्रकार के आधार पर Enums के लिए काम करेंगे। आप long आदि के लिए समान विधियां बना सकते हैं

0

यदि आप डेटा का प्रतिनिधित्व करने के लिए एक enum का उपयोग कर रहे हैं जिसमें जटिलता के कुछ गहरे स्तर (तत्वों के मनमानी समूह, "रंग का अंधेरा" इत्यादि) है और इसके कारण संघर्ष कर रहा है , मैं सुझाव दूंगा कि एक enum गलत प्रोग्रामिंग निर्माण का उपयोग करने के लिए है।

इन कार्यों के लिए एक enum का उपयोग करना हमेशा त्रुटि प्रवण होगा: यदि मैं आपके enum में एक नया रंग जोड़ता हूं, तो मुझे इसे "चमकदार" या "डार्क" में भी जोड़ना याद रखना होगा। यह आपके कोड को डेवलपर्स के लिए मूल समस्या के रूप में त्रुटि के रूप में बनाता है। क्या आप सकता है करते हैं, तथापि, रंग एक संपत्ति का संकेत है कि क्या यह उज्ज्वल है या नहीं है कि के लिए एक class या struct को परिभाषित है। फिर आपके पास स्पष्ट, समझने योग्य कार्यक्षमता होगी - इस तरह कार्यान्वित किया गया है कि जब आप एक सरल भाषा सुविधा का दुरुपयोग करने की कोशिश कर रहे हों तो नकली नतीजे न दें।

, यही कारण है कि उदाहरण के लिए, यही वजह है कि Color is a struct ...

संबंधित मुद्दे