c# - কিভাবে আমি#সি একটি স্ট্রিং একটি স্ট্রিং রূপান্তর করা উচিত?




string enums (14)

C # এ একটি পরিমাপ মানতে একটি স্ট্রিং রূপান্তর করার সেরা উপায় কী?

আমি একটি এইচটিএমএল নির্বাচন ট্যাগ আছে একটি গণনার মান ধারণকারী। যখন পৃষ্ঠাটি পোস্ট করা হয়, তখন আমি মানটি নিতে চাই (যা একটি স্ট্রিং রূপে থাকবে) এবং এটি গণনার মানতে রূপান্তর করে।

একটি আদর্শ বিশ্বের, আমি এই মত কিছু করতে পারে:

StatusEnum MyStatus = StatusEnum.Parse("Active");

কিন্তু যে একটি বৈধ কোড নয়।


.NET কোর এবং .NET> 4 এ জেনেরিক পার্স পদ্ধতি রয়েছে :

Enum.TryParse("Active", out StatusEnum myStatus);

এটি C # 7 এর নতুন ইনলাইন out ভেরিয়েবলগুলি অন্তর্ভুক্ত করে, তাই এটি চেষ্টা-প্যারাস, স্পষ্ট enum টাইপ এবং প্রাথমিকগুলিতে রূপান্তর + myStatus পরিবর্তনশীলকে populates।

যদি আপনার কাছে C # 7 এবং সর্বশেষ .NET অ্যাক্সেস থাকে তবে এটি সর্বোত্তম উপায়।

মূল উত্তর

.NET এ এটি কুৎসিত (4 বা তার উপরে পর্যন্ত):

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);

আমি এই সঙ্গে সরলীকৃত ঝোঁক:

public static T ParseEnum<T>(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

তারপর আমি করতে পারি:

StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");

মন্তব্যগুলিতে প্রস্তাবিত একটি বিকল্প হল একটি এক্সটেনশন যোগ করা, যা যথেষ্ট সহজ:

public static T ToEnum<T>(this string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();

অবশেষে, স্ট্রিংটি পার্স করা যাবে না যদি আপনি ডিফল্ট enum ব্যবহার করতে চান:

public static T ToEnum<T>(this string value, T defaultValue) 
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    T result;
    return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}

যা এই কল করে তোলে:

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

যাইহোক, আমি যেমন এক্সটেনশান পদ্ধতিটিকে string করতে (যেমন 1234.ToString().ToEnum(StatusEnum.None) নিয়ন্ত্রণ ছাড়াই) string করার জন্য সতর্ক থাকব, এটি string সমস্ত ক্ষেত্রে প্রদর্শিত হবে কিনা সেগুলি একটি 1234.ToString().ToEnum(StatusEnum.None) রাখা আছে কিনা না (তাই 1234.ToString().ToEnum(StatusEnum.None) বৈধ কিন্তু nonsensical হতে হবে)। মাইক্রোসফ্টের কোর ক্লাসগুলিকে অতিরিক্ত পদ্ধতিগুলির সাথে ঘৃণা করা এড়িয়ে চলার জন্য এটি সর্বদা সর্বোত্তম হতে পারে যা কেবলমাত্র খুব নির্দিষ্ট প্রসঙ্গে প্রয়োগ করা হয় না যতক্ষণ না আপনার সমগ্র ডেভেলপমেন্ট টিমের এই এক্সটেনশানগুলি কী করে তা বোঝা যায়।


Enum থেকে বস্তুর মান পেতে Enum.Parse ব্যবহার করতে হবে, তারপরে আপনাকে বস্তুর মান নির্দিষ্ট এননাম মানতে পরিবর্তন করতে হবে। Enum মান কাস্টিং Convert.ChangeType ব্যবহার করে করতে পারেন। নিম্নলিখিত কোড স্নিপেট একটি বর্ণন আছে দয়া করে

public T ConvertStringValueToEnum<T>(string valueToParse){
    return Convert.ChangeType(Enum.Parse(typeof(T), valueToParse, true), typeof(T));
}

TETM তে TERM তে স্ট্রিং / ধরা এবং TryParse () পদ্ধতি ছাড়া। নেট 4.5 থেকে স্ট্রিং

/// <summary>
/// Parses string to TEnum without try/catch and .NET 4.5 TryParse()
/// </summary>
public static bool TryParseToEnum<TEnum>(string probablyEnumAsString_, out TEnum enumValue_) where TEnum : struct
{
    enumValue_ = (TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0);
    if(!Enum.IsDefined(typeof(TEnum), probablyEnumAsString_))
        return false;

    enumValue_ = (TEnum) Enum.Parse(typeof(TEnum), probablyEnumAsString_);
    return true;
}

TryParse ব্যবহার করে সুপার সহজ কোড:

var value = "Active";

StatusEnum status;
if (!Enum.TryParse<StatusEnum>(value, out status))
    status = StatusEnum.Unknown;

আপনি এখন এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন:

public static T ToEnum<T>(this string value, bool ignoreCase = true)
{
    return (T) Enum.Parse(typeof (T), value, ignoreCase);
}

এবং আপনি নীচের কোডটি তাদের কল করতে পারেন (এখানে FilterType টাইপ একটি FilterType টাইপ):

FilterType filterType = type.ToEnum<FilterType>();

আপনি ব্যতিক্রমগুলি এড়াতে একটি ডিফল্ট মান সহ গৃহীত উত্তর প্রসারিত করতে পারেন:

public static T ParseEnum<T>(string value, T defaultValue) where T : struct
{
    try
    {
        T enumValue;
        if (!Enum.TryParse(value, true, out enumValue))
        {
            return defaultValue;
        }
        return enumValue;
    }
    catch (Exception)
    {
        return defaultValue;
    }
}

তারপর আপনি এটি মত কল:

StatusEnum MyStatus = EnumUtil.ParseEnum("Active", StatusEnum.None);

আমি এক্সটেনশান পদ্ধতি সমাধান পছন্দ করি ..

namespace System
{
    public static class StringExtensions
    {

        public static bool TryParseAsEnum<T>(this string value, out T output) where T : struct
        {
            T result;

            var isEnum = Enum.TryParse(value, out result);

            output = isEnum ? result : default(T);

            return isEnum;
        }
    }
}

এখানে পরীক্ষা সঙ্গে আমার বাস্তবায়ন নিচে।

using static Microsoft.VisualStudio.TestTools.UnitTesting.Assert;
using static System.Console;

private enum Countries
    {
        NorthAmerica,
        Europe,
        Rusia,
        Brasil,
        China,
        Asia,
        Australia
    }

   [TestMethod]
        public void StringExtensions_On_TryParseAsEnum()
        {
            var countryName = "Rusia";

            Countries country;
            var isCountry = countryName.TryParseAsEnum(out country);

            WriteLine(country);

            IsTrue(isCountry);
            AreEqual(Countries.Rusia, country);

            countryName = "Don't exist";

            isCountry = countryName.TryParseAsEnum(out country);

            WriteLine(country);

            IsFalse(isCountry);
            AreEqual(Countries.NorthAmerica, country); // the 1rst one in the enumeration
        }

আমি এখানে EnumMember মান আছে enum মান সঙ্গে কেস বিবেচনা করা হয় নি। তাই এখানে আমরা যেতে:

using System.Runtime.Serialization;

public static TEnum ToEnum<TEnum>(this string value, TEnum defaultValue) where TEnum : struct
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    TEnum result;
    var enumType = typeof(TEnum);
    foreach (var enumName in Enum.GetNames(enumType))
    {
        var fieldInfo = enumType.GetField(enumName);
        var enumMemberAttribute = ((EnumMemberAttribute[]) fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), true)).FirstOrDefault();
        if (enumMemberAttribute?.Value == value)
        {
            return Enum.TryParse(enumName, true, out result) ? result : defaultValue;
        }
    }

    return Enum.TryParse(value, true, out result) ? result : defaultValue;
}

এবং যে enum উদাহরণ:

public enum OracleInstanceStatus
{
    Unknown = -1,
    Started = 1,
    Mounted = 2,
    Open = 3,
    [EnumMember(Value = "OPEN MIGRATE")]
    OpenMigrate = 4
}

এই নমুনা চেষ্টা করুন:

 public static T GetEnum<T>(string model)
    {
        var newModel = GetStringForEnum(model);

        if (!Enum.IsDefined(typeof(T), newModel))
        {
            return (T)Enum.Parse(typeof(T), "None", true);
        }

        return (T)Enum.Parse(typeof(T), newModel.Result, true);
    }

    private static Task<string> GetStringForEnum(string model)
    {
        return Task.Run(() =>
        {
            Regex rgx = new Regex("[^a-zA-Z0-9 -]");
            var nonAlphanumericData = rgx.Matches(model);
            if (nonAlphanumericData.Count < 1)
            {
                return model;
            }
            foreach (var item in nonAlphanumericData)
            {
                model = model.Replace((string)item, "");
            }
            return model;
        });
    }

এই নমুনায় আপনি প্রতিটি স্ট্রিং পাঠাতে পারেন, এবং আপনার Enum সেট। যদি আপনার Enum ডেটা আপনার চেয়েছিলেন ডেটা, আপনার Enum টাইপ হিসাবে যে ফিরে।


কর্মক্ষমতা জন্য এই সাহায্য করতে পারে:

    private static Dictionary<Type, Dictionary<string, object>> dicEnum = new Dictionary<Type, Dictionary<string, object>>();
    public static T ToEnum<T>(this string value, T defaultValue)
    {
        var t = typeof(T);
        Dictionary<string, object> dic;
        if (!dicEnum.ContainsKey(t))
        {
            dic = new Dictionary<string, object>();
            dicEnum.Add(t, dic);
            foreach (var en in Enum.GetValues(t))
                dic.Add(en.ToString(), en);
        }
        else
            dic = dicEnum[t];
        if (!dic.ContainsKey(value))
            return defaultValue;
        else
            return (T)dic[value];
    }

Enum.Parse আপনার বন্ধু:

StatusEnum MyStatus = (StatusEnum)Enum.Parse(typeof(StatusEnum), "Active");

সাবধান থেকো,

enum Example
{
    One = 1,
    Two = 2,
    Three = 3
}

Enum.(Try)Parse() একাধিক, কমা দ্বারা আলাদা আর্গুমেন্ট গ্রহণ, এবং বাইনারি 'বা' সঙ্গে তাদের সম্মিলন করে। । আপনি এটি নিষ্ক্রিয় করতে পারবেন না এবং আমার মতে আপনি প্রায় এটি পছন্দ করতে পারবেন না।

var x = Enum.Parse("One,Two"); // x is now Three

Three সংজ্ঞায়িত না হলেও, x এখনও int মান পাবে 3 । এটি আরও খারাপ: Enum.Parse () আপনাকে একটি মান দিতে পারে যা Enum এর জন্য এমনকি সংজ্ঞায়িতও নয়!

আমি ব্যবহারকারীদের পরিণতি, ইচ্ছাকৃতভাবে বা অনিচ্ছাকৃতভাবে এই আচরণকে ট্রিগার করতে চাই না।

উপরন্তু, অন্যদের দ্বারা উল্লেখ করা হয়েছে, কর্মক্ষমতা বৃহত্তর enums জন্য আদর্শ চেয়ে কম, যেমন সম্ভাব্য মান সংখ্যা রৈখিক।

আমি নিম্নলিখিত সুপারিশ:

    public static bool TryParse<T>(string value, out T result)
        where T : struct
    {
        var cacheKey = "Enum_" + typeof(T).FullName;

        // [Use MemoryCache to retrieve or create&store a dictionary for this enum, permanently or temporarily.
        // [Implementation off-topic.]
        var enumDictionary = CacheHelper.GetCacheItem(cacheKey, CreateEnumDictionary<T>, EnumCacheExpiration);

        return enumDictionary.TryGetValue(value.Trim(), out result);
    }

    private static Dictionary<string, T> CreateEnumDictionary<T>()
    {
        return Enum.GetValues(typeof(T))
            .Cast<T>()
            .ToDictionary(value => value.ToString(), value => value, StringComparer.OrdinalIgnoreCase);
    }

object Enum.Parse(System.Type enumType, string value, bool ignoreCase);

সুতরাং যদি আপনি একটি মেজাজ নামক enum ছিল এটি দেখতে ভালো হবে:

   enum Mood
   {
      Angry,
      Happy,
      Sad
   } 

   // ...
   Mood m = (Mood) Enum.Parse(typeof(Mood), "Happy", true);
   Console.WriteLine("My mood is: {0}", m.ToString());

public static T ParseEnum<T>(string value)            //function declaration  
{
    return (T) Enum.Parse(typeof(T), value);
}

Importance imp = EnumUtil.ParseEnum<Importance>("Active");   //function call

একটি ===============

using System;

class Program
{
    enum PetType
    {
    None,
    Cat = 1,
    Dog = 2
    }

    static void Main()
    {

    // Possible user input:
    string value = "Dog";

    // Try to convert the string to an enum:
    PetType pet = (PetType)Enum.Parse(typeof(PetType), value);

    // See if the conversion succeeded:
    if (pet == PetType.Dog)
    {
        Console.WriteLine("Equals dog.");
    }
    }
}
-------------
Output

Equals dog.




enums