यदि स्ट्रिंग मान Enum सूची में है तो कैसे जांचें?


91

मेरे क्वेरी स्ट्रिंग में, मेरी आयु चर है ?age=New_Born

क्या कोई तरीका है जो मैं जांच सकता हूं कि क्या यह स्ट्रिंग मान New_Bornमेरी Enum सूची में है

[Flags]
public enum Age
{
    New_Born = 1,
    Toddler = 2,
    Preschool = 4,
    Kindergarten = 8
}

अगर मैं अभी बयान के लिए उपयोग कर सकता हूं, लेकिन अगर मेरी Enum सूची बड़ी हो जाती है। मैं इसे करने के लिए एक बेहतर तरीका खोजना चाहता हूं। मैं Linq का उपयोग करने के बारे में सोच रहा हूं, बस यह सुनिश्चित नहीं है कि यह कैसे करना है।


2
Enum.IsDefinedठीक नहीं है?
लेपी

जवाबों:


153

आप उपयोग कर सकते हैं:

 Enum.IsDefined(typeof(Age), youragevariable)

IsDefined को Enum उदाहरण की जाँच करने की आवश्यकता है
Viacheslav Smityukh

9
याद रखें कि Enum.IsDefined()मामला संवेदनशील है! तो यह "सार्वभौमिक समाधान" नहीं है।
चेशायर कैट

6
यह आमतौर पर अनुशंसित है कि IsDefined का उपयोग नहीं किया जाना चाहिए, क्योंकि प्रतिबिंब का उपयोग करता है, प्रदर्शन और CPU के संदर्भ में IsDefined को बहुत महंगा कॉल करता है। इसके बजाय TryParse का उपयोग करें। (pluralsight.com से सीखा)
वीहुई गुओ

40

आप Enum.TryParse विधि का उपयोग कर सकते हैं:

Age age;
if (Enum.TryParse<Age>("New_Born", out age))
{
    // You now have the value in age 
}

5
यह केवल .NET 4
गैरी रिक्टर

2
इसके साथ समस्या यह है कि यदि आप कोई पूर्णांक प्रदान करते हैं (आपके "New_Born" स्ट्रिंग के बजाय, मेरा मतलब है) तो यह सही होगा।
रोमेन विंसेंट

10

आप ट्रायपर्स विधि का उपयोग कर सकते हैं जो अगर यह सफल होती है तो यह सच है:

Age age;

if(Enum.TryParse<Age>("myString", out age))
{
   //Here you can use age
}

2

मुझे एक आसान एक्सटेंशन विधि मिली है, जो ट्रायपर्स का उपयोग करता है, क्योंकि IsDefined केस-संवेदी है।

public static bool IsParsable<T>(this string value) where T : struct
{
    return Enum.TryParse<T>(value, true, out _);
}

1

आपको अपने लक्ष्य को प्राप्त करने के लिए Enum.TryParse का उपयोग करना चाहिए

यह एक उदाहरण है:

[Flags]
private enum TestEnum
{
    Value1 = 1,
    Value2 = 2
}

static void Main(string[] args)
{
    var enumName = "Value1";
    TestEnum enumValue;

    if (!TestEnum.TryParse(enumName, out enumValue))
    {
        throw new Exception("Wrong enum value");
    }

    // enumValue contains parsed value
}

1

मुझे पता है कि यह एक पुराना धागा है, लेकिन यहाँ Enumerates पर विशेषताओं का उपयोग करते हुए थोड़ा अलग दृष्टिकोण है और फिर उस मिलान को खोजने के लिए एक सहायक वर्ग ढूंढता है।

इस तरह से आप एक एन्यूमरेट पर कई मैपिंग कर सकते हैं।

public enum Age
{
    [Metadata("Value", "New_Born")]
    [Metadata("Value", "NewBorn")]
    New_Born = 1,
    [Metadata("Value", "Toddler")]
    Toddler = 2,
    [Metadata("Value", "Preschool")]
    Preschool = 4,
    [Metadata("Value", "Kindergarten")]
    Kindergarten = 8
}

इस तरह मेरे सहायक वर्ग के साथ

public static class MetadataHelper
{
    public static string GetFirstValueFromMetaDataAttribute<T>(this T value, string metaDataDescription)
    {
        return GetValueFromMetaDataAttribute(value, metaDataDescription).FirstOrDefault();
    }

    private static IEnumerable<string> GetValueFromMetaDataAttribute<T>(T value, string metaDataDescription)
    {
        var attribs =
            value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof (MetadataAttribute), true);
        return attribs.Any()
            ? (from p in (MetadataAttribute[]) attribs
                where p.Description.ToLower() == metaDataDescription.ToLower()
                select p.MetaData).ToList()
            : new List<string>();
    }

    public static List<T> GetEnumeratesByMetaData<T>(string metadataDescription, string value)
    {
        return
            typeof (T).GetEnumValues().Cast<T>().Where(
                enumerate =>
                    GetValueFromMetaDataAttribute(enumerate, metadataDescription).Any(
                        p => p.ToLower() == value.ToLower())).ToList();
    }

    public static List<T> GetNotEnumeratesByMetaData<T>(string metadataDescription, string value)
    {
        return
            typeof (T).GetEnumValues().Cast<T>().Where(
                enumerate =>
                    GetValueFromMetaDataAttribute(enumerate, metadataDescription).All(
                        p => p.ToLower() != value.ToLower())).ToList();
    }

}

आप तब कुछ ऐसा कर सकते हैं

var enumerates = MetadataHelper.GetEnumeratesByMetaData<Age>("Value", "New_Born");

और पूर्णता के लिए यहाँ विशेषता है:

 [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
public class MetadataAttribute : Attribute
{
    public MetadataAttribute(string description, string metaData = "")
    {
        Description = description;
        MetaData = metaData;
    }

    public string Description { get; set; }
    public string MetaData { get; set; }
}

0

आयु पार्स करने के लिए:

Age age;
if (Enum.TryParse(typeof(Age), "New_Born", out age))
  MessageBox.Show("Defined");  // Defined for "New_Born, 1, 4 , 8, 12"

यह देखने के लिए कि क्या यह परिभाषित है:

if (Enum.IsDefined(typeof(Age), "New_Born"))
   MessageBox.Show("Defined");

निर्भर करता है कि आप एनम का उपयोग करने की योजना कैसे बनाते हैं Age, झंडे सही बात नहीं हो सकते हैं। जैसा कि आप शायद जानते हैं, [Flags]इंगित करता है कि आप कई मूल्यों की अनुमति देना चाहते हैं (जैसे कि थोड़ा सा मुखौटा)। क्योंकि यह कई मान है के IsDefinedलिए गलत वापस आ जाएगा Age.Toddler | Age.Preschool


2
असत्यापित इनपुट के बाद से TryParse का उपयोग करना चाहिए ।
Servy

1
MessageBox वास्तव में एक वेब वातावरण में कोई मतलब नहीं है।
Servy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.