এনুমে একটি স্ট্রিং সন্ধান করুন এবং এনামকে ফিরিয়ে দিন


163

আমার একটি গণনা রয়েছে:

public enum MyColours
{
    Red,
    Green,
    Blue,
    Yellow,
    Fuchsia,
    Aqua,
    Orange
}

এবং আমার একটি স্ট্রিং রয়েছে:

string colour = "Red";

আমি ফিরে আসতে সক্ষম হতে চাই:

MyColours.Red

থেকে:

public MyColours GetColour(string colour)

এখন পর্যন্ত আমার কাছে রয়েছে:

public MyColours GetColours(string colour)
{
    string[] colours = Enum.GetNames(typeof(MyColours));
    int[]    values  = Enum.GetValues(typeof(MyColours));
    int i;
    for(int i = 0; i < colours.Length; i++)
    {
        if(colour.Equals(colours[i], StringComparison.Ordinal)
            break;
    }
    int value = values[i];
    // I know all the information about the matched enumeration
    // but how do i convert this information into returning a
    // MyColour enumeration?
}

আপনি দেখতে পাচ্ছেন, আমি কিছুটা আটকে আছি। মান অনুসারে একটি গণক নির্বাচন করার জন্য কি আছে? কিছুটা এইরকম:

MyColour(2) 

ফলাফল হবে

MyColour.Green


4
@ নওফাল, আমি যখন এতগুলি বছর আগে এই সব জিজ্ঞাসা করেছি তখন তা খুঁজে পেল না। সদৃশ হিসাবে বন্ধ করতে ভোট দিয়েছেন।
ম্যাট ক্লার্কসন

উত্তর:


381

System.Enum.Parse দেখুন:


enum Colors {Red, Green, Blue}

// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");


72
ভুলে যাবেন না যে আপনি এটি তৃতীয়
meচ্ছিক

ঠিক আমি খুঁজছেন ছিল কি ! চিয়ার্স!
Zame

11
@ user1531040 আসলে, এখানে একটি এনাম। ট্রাইপার্স রয়েছে।
ডারলম

নোট করুন যে ইনপুট সংখ্যাসূচক হলে এনামকে পার্সিং সর্বদা 'সাফল্য' দেয়; এটি কেবল বিশ্লেষণকারী নম্বরটি দেয়, যা পরে এনামের ধরণের হয়ে যায়। সুতরাং আপনি যদি কিছু ব্যবহারকারী ইনপুটটি বৈধ এনাম বা অন্য কিছু কিনা তা পরীক্ষা করতে চান তবে আপনার প্রথমে সংখ্যার সামগ্রীটি পরীক্ষা করা উচিত। যেহেতু এটি একটি বৈধ এনাম ফেরত দেয় তবে এমন একটি মান সহ যা সংজ্ঞায়িত এনামের নামগুলিতে অস্তিত্ব রাখতে পারে না তাই আপনি কিছু সত্যই অদ্ভুত সমস্যা পেতে পারেন।
নাইয়ারগডস

19

আপনি একটি এনামের জন্য ইন্ট কাস্ট করতে পারেন

(MyColour)2

এনাম.পার্সের অপশনও রয়েছে

(MyColour)Enum.Parse(typeof(MyColour), "Red")

11

.NET (+ কোর) এবং সি # 7- এ সর্বশেষ এবং সর্বাধিক পরিবর্তনগুলি দেওয়া, এখানে সেরা সমাধানটি রয়েছে:

var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);

রঙ পরিবর্তনশীল Enum.TryParse এর ক্ষেত্রের মধ্যে ব্যবহার করা যেতে পারে



2

আমি ওরেগনগোস্টের উত্তরটি +1 চিহ্নিত করেছি, তারপরে আমি পুনরাবৃত্তিটি ব্যবহার করার চেষ্টা করেছি এবং বুঝতে পেরেছিলাম যে এটি যথাযথ নয় কারণ এনুম.গেটনামস স্ট্রিংগুলি ফিরে আসে। আপনি এনাম.গেটভ্যালুগুলি চান:

public MyColours GetColours(string colour)
{  
   foreach (MyColours mc in Enum.GetValues(typeof(MyColours))) 
   if (mc.ToString() == surveySystem) 
      return mc;

   return MyColors.Default;
}

1

আপনি Enum.Parseনাম থেকে এনাম মান পেতে ব্যবহার করতে পারেন । আপনি এর সাথে সমস্ত মানগুলিতে পুনরাবৃত্তি Enum.GetNamesকরতে পারেন, এবং আপনি কেবলমাত্র এনট মান থেকে এনাম মান পেতে একটি এনমকে একটি কাস্ট করতে পারেন।

এটি পছন্দ করুন, উদাহরণস্বরূপ:

public MyColours GetColours(string colour)
{
    foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
        if (mc.ToString().Contains(colour)) {
            return mc;
        }
    }
    return MyColours.Red; // Default value
}

বা:

public MyColours GetColours(string colour)
{
    return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}

পরবর্তীটি একটি আর্গুমেন্ট এক্সসেপশন নিক্ষেপ করবে যদি মানটি পাওয়া যায় না, আপনি এটি ফাংশনের অভ্যন্তরে ধরতে এবং ডিফল্ট মানটি ফিরে পেতে চাইতে পারেন।


দ্রষ্টব্য: কলিনের উত্তরে এটি অবশ্যই এনাম.গেটভ্যালু হওয়া উচিত ছিল।
অরেগনহোস্ট

1
var color =  Enum.Parse<Colors>("Green");

এটি সংকলনও করে না। জেনেরিক Parseপদ্ধতি নেই।
জোও মেনেইগিন

এটি আমার জন্য সংকলিত ও কাজ করেছে। সম্ভবত এটি আপনি যে সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে? আমি .NET কোর 3.1
Vinni

0

পূর্ববর্তী উত্তরে উল্লিখিত হিসাবে, আপনি সরাসরি অন্তর্নিহিত ডেটাটাইপ (int -> এনাম টাইপ) বা পার্স (স্ট্রিং -> এনুম টাইপ) এ কাস্ট করতে পারেন।

তবে সাবধান থাকুন - এনামগুলির জন্য কোনও .TryParse নেই, সুতরাং আপনার ব্যর্থতা ধরতে পার্সের চারপাশে চেষ্টা / ক্যাপ ব্লক লাগবে।


3
এই প্রশ্ন জিজ্ঞাসা করার আগে ছিল না, কিন্তু এখন। নেট 4 হিসাবে আছে! msdn.microsoft.com/en-us/library/system.enum.tryparse.aspx । এটি এনামের মতো কিছু হবে ry ট্রাইপর্স <মাই কালার> ("লাল", রঙ বাইরে)
ভায়নারডগ

0
class EnumStringToInt // to search for a string in enum
{
    enum Numbers{one,two,hree};
    static void Main()
    {
        Numbers num = Numbers.one; // converting enum to string
        string str = num.ToString();
        //Console.WriteLine(str);
        string str1 = "four";
        string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
        int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
        try
        {
            for (int i = 0; i <= getnum.Length; i++)
            {
                if (str1.Equals(getnames[i]))
                {
                    Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
                    Console.WriteLine("string found:{0}", num1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Value not found!", ex);
        }
    }
}

2
সি # এর জন্য অন্তর্নির্মিত কার্যকারিতা রয়েছে।
আর্টেমিক্স

এটি প্রশ্নের উত্তর কীভাবে? আরও সহজ কোডের জন্য অন্যান্য উত্তরগুলি দেখুন
ফিরো

0

আপনার পক্ষে কার্যকর হতে পারে এমন একটি জিনিস (ইতিমধ্যে প্রদত্ত ইতিমধ্যে বৈধ / ভাল উত্তরগুলি ছাড়াও) স্ট্রিংইনাম ধারণাটি এখানে সরবরাহ করা হয়েছে

এটির সাহায্যে আপনি শ্রেণি হিসাবে আপনার গণনাগুলি সংজ্ঞায়িত করতে পারেন (উদাহরণগুলি vb.net- এ রয়েছে):

<স্ট্রিংএইনুমরেজিস্টার্ডইলি (), ডিবাগারস্টেপ থ্রো (), অনিবার্য অবজেক্ট (সত্য)> পাবলিক নট ইনথেরিবল ক্লাস

Private Sub New(ByVal StrValue As String)
  MyBase.New(StrValue)   
End Sub

< Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")   

< Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")   

শেষ ক্লাস

এবং এখন আপনি যেমন আপনি একটি enum ব্যবহার করেন এই শ্রেণীর ব্যবহার করতে পারে: eAuthenticationMethod.WindowsAuthentication এবং এই মূলত 'বরাদ্দ মত হবে ওয়াট ' এর লজিক্যাল মান WindowsAuthentication (enum ভিতরে) এবং যদি আপনি একটি বৈশিষ্ট্য থেকে এই মান দেখতে ছিল উইন্ডো (বা অন্য কিছু যা সিস্টেম.কম্পোনেন্টমোডেল। বিবরণ বৈশিষ্ট্য ব্যবহার করে) আপনি " উইন্ডোজ প্রমাণীকরণ ব্যবহার করুন " পাবেন।

আমি এটি দীর্ঘকাল ধরে ব্যবহার করে আসছি এবং এটি কোডটি আরও সুস্পষ্ট করে তোলে।



-1

আপনি এই ব্লগ পোস্টে কিছু পরামর্শও দেখতে চাইতে পারেন: আমার নতুন ছোট বন্ধু, এনুম <টি>

পোস্টটি একটি খুব সাধারণ জেনেরিক সহায়ক শ্রেণি তৈরির একটি উপায় বর্ণনা করে যা আপনাকে সহজাত কুরুচিপূর্ণ কাস্টিং সিনট্যাক্স এড়াতে সক্ষম করে Enum.Parse- পরিবর্তে আপনি আপনার কোডটিতে এই জাতীয় কিছু লিখে শেষ করবেন:

MyColours colour = Enum<MyColours>.Parse(stringValue); 

বা একই পোস্টে কিছু মন্তব্য দেখুন যা একই অর্জনের জন্য একটি এক্সটেনশন পদ্ধতি ব্যবহার করার বিষয়ে কথা বলে।


পোস্টের লিংকটি ভেঙে গেছে।
মাচাডো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.