স্ট্রিংয়ের মান এনাম তালিকায় রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


92

আমার ক্যোয়ারী স্ট্রিংয়ে আমার একটি বয়স পরিবর্তনশীল রয়েছে ?age=New_Born।

এই স্ট্রিংয়ের মানটি New_Bornআমার এনাম তালিকায় রয়েছে কিনা তা আমি চেক করতে পারি এমন কোনও উপায় আছে কি?

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

আমি এখনই যদি বিবৃতিটি ব্যবহার করতে পারি তবে আমার এনুম তালিকাটি যদি বড় হয়। আমি এটি করার আরও ভাল উপায় খুঁজতে চাই। আমি লিনক ব্যবহার করার কথা ভাবছি, কীভাবে এটি করবেন তা নিশ্চিত নয়।


4
Enum.IsDefinedঠিক নাই?
— লেপি

উত্তর:


155

তুমি ব্যবহার করতে পার:

 Enum.IsDefined(typeof(Age), youragevariable)

আইসডিফাইন্ডের জন্য এনাম উদাহরণটি পরীক্ষা করা প্রয়োজন
— ভাইচাসলভ স্মৃতিখ

9
Enum.IsDefined()এটি কেস সেনসিটিভ মনে রাখবেন ! সুতরাং এটি কোনও "সার্বজনীন সমাধান" নয়।
— চশায়ার বিড়াল

7
এটি সাধারণত প্রস্তাবিত হয় যে আইসডিফাইন্ডটি ব্যবহার করা হবে না, কারণ ইস প্রতিচ্ছবি ব্যবহার করে, ইসডেফাইন্ডে একটি কল করে পারফরম্যান্স এবং সিপিইউয়ের দিক থেকে একটি ব্যয়বহুল কল। পরিবর্তে ট্রাই পার্স ব্যবহার করুন। (pluralsight.com থেকে শিখেছি)
— গুও

41

আপনি Enum.TryParse পদ্ধতি ব্যবহার করতে পারেন:

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

4
এটি কেবল নেট নেট 4
— গ্যারি রিখটার

4
এটির সাথে সমস্যাটি হ'ল যদি আপনি কোনও পূর্ণসংখ্যার সরবরাহ করেন তবে এটি সত্য হবে (আপনার "নিউ_বার্ন" স্ট্রিংয়ের পরিবর্তে, মানে)।
— রোমেন ভিনসেন্ট


2

আমার কাছে একটি সহজ এক্সটেনশন পদ্ধতি রয়েছে যা ট্রাই পার্স ব্যবহার করে, যেমন ইসডেফাইন্ড কেস সংবেদনশীল।

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

আমি জানি এটি একটি পুরানো থ্রেড, তবে এখানে গণকের উপর গুণাবলী ব্যবহার করে কিছুটা আলাদা পদ্ধতি এবং তারপরে মেলে সেই সংখ্যাটির সন্ধান করার জন্য একটি সহায়ক শ্রেণি।

এইভাবে আপনার একক গণিতে একাধিক ম্যাপিং থাকতে পারে।

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কারণ এর একাধিক মান রয়েছে।


4
ট্রাইপার্স ব্যবহার করা উচিত যেহেতু এটি যাচাইকৃত ইনপুট নেই।
— ই

4
মেসেজবক্স ওয়েব পরিবেশে সত্যিকার অর্থে আসে না।
— ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.