2011-03-21 10 views
6

चलो कहते हैं कि मैं इस तरह एक enum करते हैं:C# enum को बाहर

[Flags] 
public enum NotificationMethodType { 
    Email = 1, 
    Fax = 2, 
    Sms = 4 
} 

और मान लें कि मैं के रूप में एक चर परिभाषित किया गया है चलो:

NotificationMethodType types = (NotificationMethodType.Email | NotificationMethodType.Fax) 

मैं कैसे NotificationMethodType सभी मान पता लगाने की है कि "प्रकार" चर में परिभाषित नहीं हैं? दूसरे शब्दों में:

NotificationMethodType notAssigned = NotificationMethodType <that are not> types 

उत्तर

14

प्रकार की सूची कभी नहीं बदलता, तो आप ऐसा कर सकते हैं:

NotificationMethodType allTypes = NotificationMethodType.Email | 
    NotificationMethodType.Fax | 
    NotificationMethodType.Sms; 

NotificationMethodType notAssigned = allTypes & ~types; 

~ एक व्युत्क्रम मूल्य बनाता है सभी बिट्स inverting द्वारा,।

enum में दो नए नाम शामिल करने के लिए किया जाएगा कम से कम "allTypes" enum करने के लिए स्थानीय की परिभाषा रखने के लिए इस तरह के enums परिभाषित करने के लिए एक विशिष्ट तरीका:

[Flags] 
public enum NotificationMethodType { 
    None = 0, 
    Email = 1, 
    Fax = 2, 
    Sms = 4, 
    All = Email | Fax | Sms 
} 

नोट: तुम जाओ तो en12 के लिए All मान जोड़ने का मार्ग, ध्यान दें कि types खाली था, तो आपको प्रिंट "ईमेल, फैक्स, एसएमएस" के रूप में, बल्कि "सभी" के रूप में एक enum नहीं मिलेगा।

आप मैन्युअल रूप से allTypes की सूची बनाए रखने के लिए नहीं करना चाहते हैं, तो आप इसे Enum.GetValues विधि का उपयोग कर सकते हैं:

NotificationMethodType allTypes = 0; 
foreach (NotificationMethodType type in Enum.GetValues(typeof(NotificationMethodType))) 
    allTypes |= type; 

या आप LINQ के साथ भी ऐसा कर सकते हैं:

NotificationMethodType allTypes = 
    Enum.GetValues(typeof(NotificationMethodType)) 
    .Cast<NotificationMethodType>() 
    .Aggregate ((current, value) => current | value); 

यह enum के सभी व्यक्तिगत मूल्यों को एक साथ जोड़कर allType मान बनाता है।

3

एक सरल XOR चाल करना होगा ...

NotificationMethodType all = (NotificationMethodType.Email | NotificationMethodType.Fax | NotificationMethodType.Sms); 
    NotificationMethodType used = (NotificationMethodType.Email | NotificationMethodType.Fax); 
    NotificationMethodType unused = (all^used); 

इस एक छोटे से क्लीनर बनाने के लिए, सभी मूल्य अपने enum परिभाषा करने के लिए (जाहिर है 7 से निर्धारित मूल्य) सीधे जोड़ें। इस तरह, आप बाद में इस कोड

+0

fwiw, XOR (^ ऑपरेटरों) लासे की 'नहीं है और' को तोड़ने और उत्तर के बिना enum करने के लिए चीजों को जोड़ सकते हैं गणितीय एक ही बात कर रहे हैं। –

0
var notAssigned = Enum.GetValues(typeof(NotificationMethodType)) 
         .Cast<NotificationMethodType>() 
         .Where(x => !types.HasFlag(x)) 
         .Aggregate((a, x) => a | x); 
+0

2 उत्तरों में से किसी एक से कम कुशल कम है जो बिटवाई ऑपरेटरों का उपयोग करता है –

+0

@Robert: मैं इनकार नहीं कर सकता कि यह कम कुशल है, लेकिन इसकी उपयुक्तता वास्तव में ओपी की जरूरतों पर निर्भर करती है। आपके अपने उत्तर को मुख्य enum के साथ समन्वयित रखने के लिए एक अलग 'सभी' मान की आवश्यकता होती है - यदि रखरखाव दुःस्वप्न हो तो रखरखाव दुःस्वप्न! (और यह एक संभावित दक्षता समस्या की तुलना में एक कमी, आईएमओ का अधिक तरीका है, जो शायद अधिकांश स्थितियों में कभी नहीं देखा जाएगा। मैं स्पष्ट रूप से आपके डाउनवॉटिंग के साथ कम मुक्त और आसान हूं।) – LukeH

+0

सहमत हैं, सभी enum के हिस्से के रूप में परिभाषित किया जाना चाहिए –