একটি স্ট্রিংকে সি # তে এনুমে রূপান্তর করুন


894

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

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

একটি আদর্শ বিশ্বে আমি এই জাতীয় কিছু করতে পারি:

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

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

উত্তর:


1506

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

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

এটিতে সি # 7 এর নতুন ইনলাইন outভেরিয়েবলগুলিও অন্তর্ভুক্ত রয়েছে , সুতরাং এটি চেষ্টা-বিশ্লেষণ করে, সুস্পষ্ট এনাম টাইপের রূপান্তর করে এবং আরম্ভ হয় + myStatusভেরিয়েবলকে জনপ্রিয় করে তোলে।

আপনার যদি সি # 7 এ এবং সর্বশেষতম .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>();

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

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এটির মতো কোনও এক্সটেনশন পদ্ধতি যুক্ত করা (নেমস্পেস নিয়ন্ত্রণ ছাড়াই) এটি stringএনাম রাখে বা না রাখে তা সমস্ত ক্ষেত্রে প্রদর্শিত হবে (সুতরাং 1234.ToString().ToEnum(StatusEnum.None)এটি বৈধ তবে অযৌক্তিক হবে)। মাইক্রোসফ্টের মূল ক্লাসগুলি অতিরিক্ত পদ্ধতির সাথে ঝাঁকুনি দেওয়া এড়ানো ভাল often তবে কেবলমাত্র আপনার নির্দিষ্ট বিকাশকারী দলের those এক্সটেনশনগুলি কী করে সে সম্পর্কে খুব ভাল ধারণা না থাকলে কেবলমাত্র খুব নির্দিষ্ট প্রসঙ্গে প্রযোজ্য।


17
পারফরম্যান্স যদি গুরুত্বপূর্ণ হয় (যা সর্বদা থাকে) নীচে ম্যাকেনজিএগ 1 দ্বারা প্রদত্ত chk উত্তর: stackoverflow.com/questions/16100/…
ন্যাশ

28
@ ম্যাককেনজি জি 1 এর উত্তর সম্পর্কে @avinashr ঠিক আছে, তবে এটি সবসময় গুরুত্বপূর্ণ নয়। উদাহরণস্বরূপ এনাম পার্সিংয়ের বিষয়ে চিন্তা করা অর্থহীন মাইক্রো অপ্টিমাইজেশন হবে যদি আপনি প্রতিটি পার্সের জন্য একটি ডিবি কল করেন।
কিথ

4
@ এইচএম আমি এখানে কোনও এক্সটেনশন উপযুক্ত বলে মনে করি না - এটি কিছু বিশেষ ক্ষেত্রে এবং এটি একটি এক্সটেনশন প্রতিটি স্ট্রিংয়ের ক্ষেত্রে প্রযোজ্য । আপনি যদি সত্যিই এটি করতে চান তবে এটি একটি তুচ্ছ পরিবর্তন হবে।
কীথ

7
Enum.TryParse সম্পর্কে কীভাবে?
ইলাইন

15
খুব সুন্দর. আপনার শেষের উদাহরণে আপনার যেখানে টি: স্ট্রাক্ট দরকার।
bbrik

330

Enum.TryParse<T>(String, T)(≥। নেট 4.0): ব্যবহার করুন

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

সি # 7.0 এর প্যারামিটার ধরণের ইনলাইনিংয়ের মাধ্যমে এটি আরও সরল করা যায় :

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

45
কেস-সংবেদনশীলতার জন্য মাঝারি বুলিয়ান প্যারামিটার যুক্ত করুন এবং এটি এখন পর্যন্ত সবচেয়ে নিরাপদ এবং সর্বাধিক মার্জিত সমাধান।
ড্যানএম 7

18
আসুন, আপনি কতজন নির্বাচিত উত্তরটি ২০০৮ সাল থেকে কেবলমাত্র নীচে স্ক্রোল করার জন্য প্রয়োগ করেছিলেন এবং এটি খুঁজে পেতে এটি আরও ভাল (আধুনিক) উত্তর।
Tek

@TEK আমি আসলে ২০০৮ এর উত্তর পছন্দ করি।
জিরো 3

আমি পাই না। Parseরূপান্তরটির সাথে কী ভুল হয়েছে তার ব্যাখ্যামূলক ব্যতিক্রম ছুঁড়ে ফেলা হয়েছে (মানটি ছিল null, খালি বা কোনও সংশ্লিষ্ট এনাম ধ্রুবক), যা TryParse'বুলিয়ান রিটার্ন
ভ্যালু'র

2
এনুম। ট্রাই পার্স <টি> (স্ট্রিং, টি) পূর্ণসংখ্যার স্ট্রিং পার্স করার সময় ত্রুটিযুক্ত। উদাহরণস্বরূপ, এই কোডটি অযৌক্তিক এনাম হিসাবে একটি অযৌক্তিক স্ট্রিংটিকে সফলভাবে পার্স করবে: var result = Enum.TryParse<System.DayOfWeek>("55", out var parsedEnum);
ম্যাস ডট নেট

196

নোট করুন যে এর কর্মক্ষমতাটি Enum.Parse()ভয়াবহ, কারণ এটি প্রতিবিম্বের মাধ্যমে প্রয়োগ করা হয়েছে। (একই কথা সত্য Enum.ToString, যা অন্য পথে চলে)

যদি আপনাকে পারফরম্যান্স-সংবেদনশীল কোডে এনামগুলিতে স্ট্রিং রূপান্তর করতে হয় তবে আপনার সেরা বেট হ'ল Dictionary<String,YourEnum>শুরুতে একটি তৈরি করা এবং তা আপনার রূপান্তরগুলি করতে ব্যবহার করুন।


10
আমি একটি ডেস্কটপ কম্পিউটারে প্রথম রান করে একটি স্ট্রুমকে এনুমে রূপান্তর করতে 3 এমএস পরিমাপ করেছি। (কেবল উদাসীনতার স্তরটি বর্ণনা করার জন্য)।
ম্যাথিউ

12
বাহ 3 এমএস হ'ল ভয়ঙ্কর মাত্রার অর্ডার
জন স্টক

1
আপনি কি এই চারপাশে একটি কোড নমুনা যুক্ত করতে পারেন, তাই আমরা কীভাবে প্রতিস্থাপন ও ব্যবহার করব সে সম্পর্কে একটি ধারণা পাই
ট্রান্সফর্মার

যদি আপনার অ্যাপ্লিকেশনটি 1 মিলিয়ন লোক ব্যবহার করে => এটি আপনার গ্রাস করছে মানব জীবনের 50 ঘন্টা পর্যন্ত যোগ করে :) একক পৃষ্ঠা ব্যবহারে। : পি
ক্যাটলিন রাডোই


31

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

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

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

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

1
আমি মানটিকে অবজেক্ট হিসাবে নিতে এবং এই পদ্ধতির অভ্যন্তরে স্ট্রিংয়ে কাস্ট করতে এটি আপডেট করেছি। এইভাবে আমি একটি মান মান নিতে পারি। শুধুমাত্র স্ট্রিং এর পরিবর্তে টোইনাম।
রিয়েলসোলিএম

2
@ সলিএম আমি বলব এটি একটি ভয়ঙ্কর ধারণা কারণ তবে এই এক্সটেনশন পদ্ধতিটি সমস্ত বস্তুর ধরণের ক্ষেত্রে প্রযোজ্য হবে । দুটি এক্সটেনশন পদ্ধতি, একটি স্ট্রিংয়ের জন্য এবং একটি ইন্টার-এর জন্য, আমার মতে পরিষ্কার এবং অনেক বেশি নিরাপদ হবে।
Svish

@ সুইশ, এটি সত্য। আমি এটি করার একমাত্র কারণ হ'ল আমাদের কোডটি কেবল অভ্যন্তরীণভাবে ব্যবহৃত হয় এবং আমি 2 টি এক্সটেনশন লেখা এড়াতে চেয়েছিলাম। এবং যেহেতু আমরা কেবলমাত্র এনামে রূপান্তর করেছি স্ট্রিং বা ইন্টের সাথে, তাই আমি অন্যথায় এটি কোনও সমস্যা হিসাবে দেখিনি।
রিয়েলসোলিএম

3
@ সলিলিম অভ্যন্তরীণ বা না, আমি এখনও আমার কোড রক্ষণাবেক্ষণ এবং ব্যবহার করছি: পিআই আমি বিরক্ত হব যদি আমি প্রতিটি ইন্টেলিজেন্স মেনুতে টোইনাম উঠি, এবং আপনি যেমন বলেছিলেন যেহেতু আপনি কেবলমাত্র এনামে রূপান্তর করেছেন কেবল স্ট্রিং থেকে বা int, আপনি খুব নিশ্চিত হতে পারেন যে আপনার কেবলমাত্র এই দুটি পদ্ধতি দরকার। এবং দুটি পদ্ধতি একের চেয়ে অনেক বেশি নয়, বিশেষত যখন তারা এই ছোট এবং ইউটিলিটি ধরণের হয়: P
Svish

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

সুতরাং আপনার যদি মেজাজ নামের এনাম থাকে তবে এটি দেখতে এই রকম হবে:

   enum Mood
   {
      Angry,
      Happy,
      Sad
   } 

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

18

সাবধান থেকো,

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

Enum.(Try)Parse() একাধিক, কমা দ্বারা পৃথক আর্গুমেন্ট গ্রহণ করে এবং তাদের সাথে বাইনারি 'বা' যুক্ত করে| । আপনি এটি অক্ষম করতে পারবেন না এবং আমার মতে আপনি এটি কখনই চান না।

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

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

আমি এই আচরণটি ট্রিগার করে স্বেচ্ছায় বা অনিচ্ছায় ব্যবহারকারীর পরিণতিগুলি দেখতে চাই না।

অতিরিক্ত হিসাবে, অন্যদের দ্বারা উল্লিখিত হিসাবে, পারফরম্যান্স বড় এনামগুলির পক্ষে আদর্শের চেয়ে কম, সম্ভাব্য মানের সংখ্যার ক্ষেত্রে লিনিয়ার।

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

    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);
    }

4
আসলে এটি জানতে খুব দরকারী Enum.(Try)Parse accepts multiple, comma-separated arguments, and combines them with binary 'or'। এর অর্থ আপনি আপনার এনাম মানগুলিকে 2 এর শক্তি হিসাবে সেট করতে পারেন এবং একাধিক বুলিয়ান পতাকা বিশ্লেষণের জন্য আপনার খুব সহজ উপায় আছে, যেমন। "UseSSL, NoRetries, সিঙ্ক"। আসলে এটি সম্ভবত এটির জন্য ডিজাইন করা হয়েছিল।
পিসিদেব


13

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

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);

যদি ডিফল্ট মানটি এনাম না হয় তবে ট্রাই পার্স ব্যর্থ হয়ে একটি ব্যতিক্রম ছুঁড়ে ফেলবে যা ধরা পড়ে।

বহু বছর ধরে আমাদের কোডটিতে এই ফাংশনটি ব্যবহার করার বছর পরে সম্ভবত এই অপারেশনটির পারফরম্যান্সের জন্য ব্যয় করা তথ্যটি যুক্ত করা ভাল!


আমি ডিফল্ট মান পছন্দ করি না। এটি অপ্রত্যাশিত ফলাফল হতে পারে।
ড্যানিয়েল তুল্প

5
এটি কখন ব্যতিক্রম ছুঁড়ে ফেলবে?
andleer

@ এন্ডলিয়ার যদি এনাম মান ডিফল্ট মান হিসাবে একই এনাম টাইপের সাথে মানানসই হয়
নেলি

@ নেলি ওল্ড কোড এখানে কিন্তু defaultValue এবং পদ্ধতি রিটার্ন টাইপ উভয় প্রকারের T। প্রকারগুলি পৃথক হলে, আপনি একটি সংকলন সময় ত্রুটি পাবেন: "'কনসোল অ্যাপ1.সাইজ' থেকে 'কনসোল অ্যাপ1.রঙারে' রূপান্তর করতে পারবেন না" বা আপনার ধরণের যা কিছু হোক না কেন।
andleer

@ এন্ডলিয়ার, আমি দুঃখিত আপনি আমার শেষ উত্তরটি সঠিক ছিল না। সম্ভবত এই পদ্ধতিটি একটি সিস্টেম ছুঁড়ে দেয় rআর্গুমেন্ট এক্সসেপশন ক্ষেত্রে কেউ এই ফাংশনটিকে একটি ডিফল্ট মান দিয়ে কল করে যা এনাম টাইপ নয়। সি # 7.0 দিয়ে আমি টি: এনুমের কোনও ক্লোজ করতে পারি না। আমি কেন চেষ্টা করে এই সম্ভাব্যতাটি ধরলাম ts
নেলি

8

আমরা পুরোপুরি বৈধ ইনপুট ধরে নিতে পারি না, এবং @ কিথের উত্তরের এই পরিবর্তনের সাথে চলেছি:

public static TEnum ParseEnum<TEnum>(string value) where TEnum : struct
{
    TEnum tmp; 
    if (!Enum.TryParse<TEnum>(value, true, out tmp))
    {
        tmp = new TEnum();
    }
    return tmp;
}


5

.NET 4.5 থেকে ট্রাইপার্স () পদ্ধতি ছাড়াই চেষ্টা / ধরা ছাড়াই এবং TEnum এ স্ট্রিং পার্স করে

/// <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;
}

1
কোডটিতে ইতিমধ্যে একটি বিবরণ উপস্থিত থাকলে একটি বিবরণ তৈরি করা দরকার কিনা? ঠিক আছে, আমি এটি করেছি :)
jite.gs

3

ট্রাইপার্স ব্যবহার করে সুপার সিম্পল কোড:

var value = "Active";

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

2

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

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
        }

1
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.

1

আমি ক্লাস (পার্সিং এবং পারফরম্যান্স উন্নতির সাথে এনুমের দৃ strongly়ভাবে টাইপিত সংস্করণ) ব্যবহার করেছি। আমি এটি গিটহাবে খুঁজে পেয়েছি এবং এটি। নেট 3.5 এর জন্যও কাজ করা উচিত। এটি অভিধানের বাফার করার পরে এটির কিছুটা ওভারহেড রয়েছে।

StatusEnum MyStatus = Enum<StatusEnum>.Parse("Active");

ব্লগপোস্টটি এনামস - আরও ভাল বাক্য গঠন, উন্নত পারফরম্যান্স এবং নেট 3.5 তে ট্রাই পার্সে

এবং কোড: https://github.com/damieng/DamienGKit/blob/master/CSharp/DamienG.Library/System/EnumT.cs


1

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

    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];
    }

1

আমি দেখতে পেয়েছি যে এখানে এনাম মেম্বার মান রয়েছে এমন এনাম মানগুলির ক্ষেত্রে বিবেচনা করা হয়নি। সুতরাং আমরা এখানে যেতে:

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;
}

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

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

1

এনামের কাছ থেকে অবজেক্টের মান পেতে আপনাকে Enum.Parse ব্যবহার করতে হবে, তার পরে আপনাকে বস্তুর মানটি নির্দিষ্ট এনুম মানতে পরিবর্তন করতে হবে। কনভার্ট.চেঞ্জটাইপ ব্যবহার করে এনাম মান কাস্টিং করা যায়। নিম্নলিখিত কোড স্নিপেট উপর একবার দেখুন

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

1

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

 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টাইপ হিসাবে ফিরিয়ে দিন ।


1
আপনি newModelপ্রতিটি লাইনে ওভাররাইট করছেন, সুতরাং এতে যদি ড্যাশ থাকে তবে এটি প্রতিস্থাপন করা হবে না। এছাড়াও, আপনাকে স্ট্রিংটিতে কিছু রয়েছে কিনা তা খতিয়ে দেখার দরকার নেই, আপনি Replaceযেভাবেই কল করতে পারেন :var newModel = model.Replace("-", "").Replace(" ", "");
লার্স ক্রিস্টেনসেন

@ লার্সক্রিস্টেনসেন হ্যাঁ আমরা এমন একটি পদ্ধতি তৈরি করতে পারি যা ননালফ্যানুমেরিক চরিত্রটিকে সরিয়ে দেয়।
আমিররেজা-ফারহালাঘা

1

এটি কখন যুক্ত হয়েছিল তা নিশ্চিত নয় তবে এনাম ক্লাসে এখন একটি

Parse<TEnum>(stringValue)

উদাহরণস্বরূপ প্রশ্নের সাথে যেমন ব্যবহার করা হয়:

var MyStatus = Enum.Parse<StatusEnum >("Active")

বা কেসিং উপেক্ষা করে:

var MyStatus = Enum.Parse<StatusEnum >("active", true)

এখানে ব্যবহৃত পচনশীল পদ্ধতিগুলি:

    [NullableContext(0)]
    public static TEnum Parse<TEnum>([Nullable(1)] string value) where TEnum : struct
    {
      return Enum.Parse<TEnum>(value, false);
    }

    [NullableContext(0)]
    public static TEnum Parse<TEnum>([Nullable(1)] string value, bool ignoreCase) where TEnum : struct
    {
      TEnum result;
      Enum.TryParse<TEnum>(value, ignoreCase, true, out result);
      return result;
    }

0
        <Extension()>
    Public Function ToEnum(Of TEnum)(ByVal value As String, ByVal defaultValue As TEnum) As TEnum
        If String.IsNullOrEmpty(value) Then
            Return defaultValue
        End If

        Return [Enum].Parse(GetType(TEnum), value, True)
    End Function


0

সম্পত্তির নাম যদি আপনি এটি কল করতে চান তার চেয়ে আলাদা হয় (অর্থাত্ ভাষার পার্থক্য) আপনি এটি করতে পারেন:

MyType.cs

using System;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public enum MyType
{
    [EnumMember(Value = "person")]
    Person,
    [EnumMember(Value = "annan_deltagare")]
    OtherPerson,
    [EnumMember(Value = "regel")]
    Rule,
}

EnumExtensions.cs

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public static class EnumExtensions
{
    public static TEnum ToEnum<TEnum>(this string value) where TEnum : Enum
    {
        var jsonString = $"'{value.ToLower()}'";
        return JsonConvert.DeserializeObject<TEnum>(jsonString, new StringEnumConverter());
    }

    public static bool EqualsTo<TEnum>(this string strA, TEnum enumB) where TEnum : Enum
    {
        TEnum enumA;
        try
        {
            enumA = strA.ToEnum<TEnum>();
        }
        catch
        {
            return false;
        }
        return enumA.Equals(enumB);
    }
}

Program.cs

public class Program
{
    static public void Main(String[] args) 
    { 
        var myString = "annan_deltagare";
        var myType = myString.ToEnum<MyType>();
        var isEqual = myString.EqualsTo(MyType.OtherPerson);
        //Output: true
    }     
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.