2011-03-16 16 views
23

मेरे पास एक काफी बुनियादी सवाल है: मैं यह कैसे जांच सकता हूं कि दिए गए मान एनम मूल्यों की सूची में निहित है या नहीं?वैल्यू एनम सूची में है

उदाहरण के लिए, मैं इस enum है:

public enum UserStatus 
{ 
    Unverified, 
    Active, 
    Removed, 
    Suspended, 
    Banned 
} 

अब मैं जाँच करना चाहते हैं, तो status in (Unverified, Active)

मैं इस काम करता है:

bool ok = status == UserStatus.Unverified || status == UserStatus.Active; 

लेकिन वहाँ एक और अधिक सुरुचिपूर्ण हो गया है इसे लिखने का तरीका।

this queston का विषय बहुत समान है, लेकिन यह झंडे के साथ काम कर रहा है, और यह झंडे enum नहीं है।

अग्रिम धन्यवाद।

+0

स्थिति चर के डेटाप्रकार क्या है? – Lav

उत्तर

51

यहाँ एक विस्तार विधि है कि परिस्थितियों का एक बहुत में एक बहुत मदद करता है निम्नलिखित की कोशिश कर सकते हैं।

public static class Ext 
{ 
    public static bool In<T>(this T val, params T[] values) where T : struct 
    { 
     return values.Contains(val); 
    } 
} 

उपयोग:

Console.WriteLine(1.In(2, 1, 3)); 
Console.WriteLine(1.In(2, 3)); 
Console.WriteLine(UserStatus.Active.In(UserStatus.Removed, UserStatus.Banned)); 
+0

+1 मुझे आपका समाधान पसंद है –

+0

हां, यह वही है जो मैं ढूंढ रहा था। दोबारा, सुनिश्चित नहीं है कि यह क्यों अंतर्निहित नहीं है, लेकिन कम से कम यह संभव है। :) धन्यवाद! –

+0

यह एक बहुत अच्छा तरीका है! –

22

यदि यह enums की एक लंबी सूची है, तो आप उपयोग कर सकते हैं:

var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active }; 
bool ok = allowed.Contains(status); 

अन्यथा लंबे || विधेय के आसपास कोई रास्ता नहीं है, प्रत्येक की अनुमति मान को चेक।

1

क्यों इसे encapsulate करने के लिए एक विधि नहीं बनाते?

public bool UnVerifiedOrActive(User user) 
{ 
    return (user.UserStatus == UserStatus.Unverified || 
      user.UserStatus == UserStatus.Active); 
} 
+0

या आप इसे एक स्थिर वर्ग के अंदर एक विस्तार विधि में बना सकते हैं ... –

+0

धन्यवाद, लेकिन यह वास्तव में संक्षिप्त कोड के बारे में अधिक नहीं है, डीआरवाई का मामला नहीं है। मुझे अभी भी यकीन नहीं है कि क्यों सी # में कुछ प्रकार का 'इन' ऑपरेटर नहीं है जिसका उपयोग इस तरह के मामलों के लिए किया जा सकता है। –

0

आप

UserStatus ustatus; 
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus)) 
{ 
..Your logic 
} 
1
UserStatus userStatus = null; 
Eum.TryParse<UserStatus>(status.ToString(), out userStatus); 

if(userStatus != null) 
{ 
    //it is not in the list 
} 
+0

मुझे नहीं लगता कि यह काम करेगा, क्योंकि यह मूल्यों के सबसेट के बजाय enum में प्रत्येक मान के विरुद्ध जांच कर रहा है (यदि मैं सही ढंग से पढ़ रहा हूं)। –

+0

@ जेराड यह काम करता है। कोशिश करो। मेरे पास वही समाधान है जो 'Lav' ने –

+0

@Avian पोस्ट किया है - लेकिन आप केवल असत्यापित या सक्रिय मानों (बनाम अन्य तीन मानों) के लिए कहां जांचते हैं? –

6

उपयोग Enum.IsDefined

उदाहरण:

public enum enStage {Work, Payment, Record, Return, Reject}; 
int StageValue = 4; 

Enum.IsDefined(typeof(enStage), StageValue) 
संबंधित मुद्दे