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


163

এনট 3.5.৫ এ এনামকে স্ট্রিংয়ে রূপান্তর করার পছন্দের উপায় কোনটি?

  • Enum.GetName
  • Enum.Format
  • স্ট্রিং

আমি কেন এর অন্যটির চেয়ে বেশি পছন্দ করব? কেউ কি আরও ভাল পারফর্ম করে?


10
আমি অনুসন্ধান করেছি এবং একটি সদৃশ খুঁজে পেতে অক্ষম। আপনি যদি কোনও লিঙ্ক সরবরাহ করতে পারেন তবে আমি এই প্রশ্নটি মুছে ফেলব।
এরিক ওয়েলনাউ

1
কখনও কখনও, একটি স্যুইচ স্টেটমেন্ট ব্যবহার করা সেরা অনুশীলন নয় (যখন আপনার বড় সংখ্যা থাকে) আপনি ডিক্ট <> এর পরিবর্তে ব্যবহার করতে পারেন
গাই এল

1
আপনি যদি আরও ভাল পারফরম্যান্স চান তবে আপনি এই নিবন্ধে বর্ণিত ক্লাসটি কোডড্রজেক্ট / কেবি / ডটনেট / এনাম.এএসপিএক্স ব্যবহার করতে পারেন । ব্যবহারের এই Enum <YourEnum> .ToString (yourValue) অথবা Enum দেখতে কেমন হবে <YourEnum> .ToString ((int-) yourValue)
ideafixxxer

5
ডটফসেকেশন না ভাঙার কোডিং হ'ল লেজটি কুকুরটিকে দুলিয়ে। এসডাব্লু প্রযোজকরা ভাবছেন না, "আসুন একটি দুর্দান্ত অ্যাপ তৈরি করব যাতে ডটফাসেকটারের কিছু করার থাকে।" ডাবফাসেক্টর এসডাব্লু বিকাশের সুবিধার্থে বিদ্যমান exists যদি তা না করতে পারে ... পারো!
মাইকাহুভার

উত্তর:


125

সি # 6 হিসাবে এনামের নাম পাওয়ার সর্বোত্তম উপায় হ'ল নতুন nameofঅপারেটর:

nameof(MyEnum.EnumValue);

// Ouputs
> "EnumValue"

এটি সংকলনের সময়ে এনামগুলি সংকলিত ফলাফলের স্ট্রিং দ্বারা প্রতিস্থাপনের সাথে কাজ করে, যার পরিবর্তে এটি সম্ভবত দ্রুততম উপায় the

এনাম নামগুলির যে কোনও ব্যবহার কোড প্ররোচনার সাথে হস্তক্ষেপ করে না, যদি আপনি এনাম নামগুলি অবহেলা বিবেচনা করে সার্থক বা গুরুত্বপূর্ণ হিসাবে বিবেচনা করেন - তবে সম্ভবত এটি সম্পূর্ণ অন্য একটি প্রশ্ন।


11
এটি আরও মনোযোগ দেওয়ার দাবি রাখে। স্পষ্ট সীমাবদ্ধতা তবুও, সংকলন-সময় ইনপুট জন্য প্রয়োজনীয়। আমার মতে এটি যখনই সম্ভব পছন্দ করা উচিত । 'পুনঃনামকরণ' এবং 'সমস্ত রেফারেন্সগুলি সন্ধান করুন' এটিকেও বিবেচনায় রাখেন, সম্ভবত যাদু স্ট্রিং এবং সদৃশ স্থানে এড়ানো।
টিমো

1
সুতরাং আমি অনুমান করি যখন রানটাইমের সময় এনাম মানটি সংজ্ঞায়িত হয় তা কাজ করবে না? উদাঃ MyEnum ভেরিয়েবলএনাম; ভেরিয়েবলএনাম = setEnumValueMethod (); nameof (variableEnum);
ম্যাকস্টার

1
@Maxter না, যেমন nameof(variableEnum)হতে হবে "variableEnum"। এটা তোলে (বিল্ড সময়ে) প্রতিফলিত করে নাম ক্ষেত্র / সম্পত্তি / PARAM / পরিবর্তনশীল না মান
কিথ

তোমরা। দুর্ভাগ্যক্রমে আপনি এটি করলে কাজ করে না: var someEnumvalue = SomeEnum.FooBar; নেমফ (কিছুসংখ্যক);
স্কোবালি

1
@ সম্ভবত হ্যাঁ, এটি ফিরে আসবে "someEnumValue", যখন আপনার দরকার nameof(SomeEnum.FooBar)হবে"FooBar"
কিথ

93

আমাদের প্রকল্পের জন্য কাজ করে ...

public static String convertToString(this Enum eff)
{
    return Enum.GetName(eff.GetType(), eff);
}

public static EnumType converToEnum<EnumType>(this String enumValue)  
{
    return (EnumType) Enum.Parse(typeof(EnumType), enumValue);
}

7
Enum.GetName একটি অবজেক্ট আর্গুমেন্ট হিসাবে মান গ্রহণ করে। এর অর্থ হল যে মূল্যটি বাক্স হবে এবং এটি বরাদ্দ এবং আবর্জনা সংগ্রহের ক্ষেত্রে সিপিইউ সংস্থানগুলি নষ্ট করবে। এটি যদি অনেক সময় করা হয় তবে এনাম.গেটনামের অভিধানে মানগুলি ক্যাশে করা এবং সেখানে নাম সন্ধান করার চেয়ে অনেক কম থ্রুপুট থাকবে।
রান

@ রান তাই সমাধান কি, পরিবর্তে কোনটি ব্যবহার করবেন?
শাইজুট

এটি উত্তর হওয়া উচিত
স্কোবলিয়ে

আমার প্রকল্পটি ধীর করে তোলে। toString () দ্রুত।
d2k2

29

আমার পরীক্ষায়, Enum.GetNameদ্রুত এবং শালীন ব্যবধানে ছিল। অভ্যন্তরীণ ToStringকল Enum.GetName। .NET 4.0 এর জন্য উত্স থেকে , প্রয়োজনীয়:

public override String ToString()
{
     return Enum.InternalFormat((RuntimeType)GetType(), GetValue());
}

private static String InternalFormat(RuntimeType eT, Object value)
{
    if (!eT.IsDefined(typeof(System.FlagsAttribute), false))
    {
        String retval = GetName(eT, value); //<== the one
        if (retval == null)
            return value.ToString();
        else
            return retval;
    }
    else
    {
        return InternalFlagsFormat(eT, value);
    }
}

আমি বলতে পারছি না এটি নিশ্চিত হওয়ার কারণ, তবে পরীক্ষাগুলি একের তুলনায় অন্যটির চেয়ে দ্রুত। উভয় কলগুলিতে বক্সিং জড়িত (বাস্তবে তারা প্রতিবিম্ব কল, আপনি মূলত ক্ষেত্রের নামগুলি পুনরুদ্ধার করছেন) এবং আপনার পছন্দ অনুসারে ধীর হতে পারে।

পরীক্ষার সেটআপ : 8 টি মান সহ এনাম no পুনরাবৃত্তির = 1000000

ফলাফল : এনাম.গেটনাম => 700 এমএস, টোস্ট্রিং => 2000 এমএস

যদি গতি লক্ষণীয় না হয়, তবে আমি এটি যত্ন ও ব্যবহার করব না ToStringকারণ এটি অনেক বেশি ক্লিনার কল দেয়। কনট্রাস্ট

Enum.GetName(typeof(Bla), value)

সঙ্গে

value.ToString()

25

Enum.GetName (...)

এটি এর জন্য বোঝানো সবচেয়ে মার্জিত পদ্ধতি।

var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);

যদিও আমি কলিংয়ের সাথে কোনও সমস্যা দেখতে পাচ্ছি না .ToString()কারণ এটি সহজতর খাটো।

var enumValueString = MyEnum.MyValue.ToString();

নতুন সি # 6 সিনট্যাক্স সহ আপনি ব্যবহার করতে পারেন:

nameof(MyEnum.MyValue)

20

এই সমস্ত অভ্যন্তরীণভাবে ডাকা একটি পদ্ধতি কল করে InternalGetValueAsStringToStringএবং এর মধ্যে পার্থক্য হ'ল প্রথমে কয়েকটি জিনিস যাচাই GetNameকরতে হবে GetName:

  1. আপনি যে প্রকারটি লিখেছেন তা বাতিল নয়।
  2. আপনি যে প্রকারটি লিখেছেন তা হ'ল একটি গণনা।
  3. আপনি যে মানটি পাস করেছেন তা শূন্য নয়।
  4. আপনি যে মানটি পাস করেছেন তা হ'ল এমন একটি ধরণের যা একটি গণনা আসলে এটি অন্তর্নিহিত প্রকার হিসাবে ব্যবহার করতে পারে, বা নিজেই গণনার ধরণের। এটি GetTypeপরীক্ষা করে মান ব্যবহার করে।

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


2
এগুলি আপনি কোথায় চেক আপ করেছেন? সমাবেশের সংস্করণটি কী ছিল? আমি খুব ভিন্ন ফলাফল পেতে।
নওফাল

17

এমএসডিএন-এই সম্পর্কিত সম্পর্কিত প্রশ্নটি আমি খুঁজে পেতে পারি , যার মধ্যে একটি এক্সএমএল স্নিপেট রয়েছে যা এই প্রশ্নের উত্তর দেয়। এর মধ্যে যে কোনও একটি পদ্ধতি একই ত্রুটি ভাগ করে নেয়: তারা কল করে enum.toString(), যা ডটফাসকেশন ব্যবহার করার সময় সঠিকভাবে কাজ করে না । অন্যান্য উদ্বেগগুলি পরোক্ষ বক্সিং (গেটনাম এবং ফর্ম্যাট) এর সাথে সম্পর্কিত বলে মনে হয়। দুর্ভাগ্যক্রমে, আমি উপরের কোনওটি ব্যবহারের জন্য কোনও কার্যকারিতা কারণগুলি খুঁজে পাচ্ছি না।

এক্সএমএল স্নিপেট থেকে প্যারাফ্রেসিং ,

একটি বাক্সযুক্ত এনাম স্ট্রিং-এ ফরম্যাট () বা অন্য কোনও ফাংশনে পাস করার ফলে enum.ToString()ডাকা হতে পারে। এটি ডটফাসকাটিং করার সময় সমস্যা তৈরি করবে। আপনি ব্যবহার করা উচিত নয় enum.ToString(), enum.GetNames(), enum.GetName(), enum.Format()বা enum.Parse()একটি স্ট্রিং একটি enum রূপান্তর করবে। পরিবর্তে, একটি স্যুইচ স্টেটমেন্ট ব্যবহার করুন, এবং প্রয়োজনে নামগুলি আন্তর্জাতিকীকরণ করুন।


16

Enum.GetName()

Format()GetName()কিছু ফর্ম্যাটিং কার্যকারিতা (বা InternalGetValueAsString()নির্ভুল হতে) সহ সত্যই কেবল একটি মোড়ক । ToString()বেশ হিসাবে একই Format()। আমি মনে করি GetName()এটি সর্বোত্তম বিকল্প হিসাবে যেহেতু উত্সটি পড়ে যে কেউ এটির জন্য এটি সম্পূর্ণভাবে সুস্পষ্ট।


8

আমি একটি "বিবরণ" এক্সটেনশন পদ্ধতি তৈরি করি এবং এটি এনামের সাথে সংযুক্ত করি যাতে আমি সত্যিই ব্যবহারকারী-বান্ধব নামকরণ পেতে পারি যার মধ্যে ফাঁকা স্থান এবং আবরণ অন্তর্ভুক্ত থাকে। আমি এনাম মানটি নিজেকে প্রদর্শনযোগ্য পাঠ্য হিসাবে ব্যবহার করতে পছন্দ করি নি কারণ এটি এমন কিছু যা আমরা বিকাশকারীরা আরও পঠনযোগ্য কোড তৈরি করতে ব্যবহার করি। এটি ইউআই প্রদর্শনের উদ্দেশ্যে নয়। আমি পুরোপুরি এনামগুলি না পেরে এবং ইউআই পরিবর্তন করতে সক্ষম হতে চাই।


6

"পছন্দের" পদ্ধতিটি কী তা আমি জানি না (100 জনকে জিজ্ঞাসা করুন এবং 100 টি ভিন্ন মতামত পান) তবে কী সহজ এবং কোনটি কার্যকর তা করে। GetNameকাজ করে তবে আরও অনেক কিস্ট্রোক দরকার requires ToString()কাজটি খুব ভালভাবে করা হচ্ছে বলে মনে হচ্ছে


1

ভিবি আফিকোনাডোর জন্য:

EnumStringValue = System.Enum.GetName(GetType(MyEnum), MyEnumValue)


0

ToString()ব্যবহারের সময় পাঠযোগ্যতার দৃষ্টিকোণ থেকে সর্বাধিক সুস্পষ্ট ফলাফল দেয়Enum.GetName() এটির চেষ্টা কী তা দ্রুত বুঝতে আরও কিছুটা মানসিক বিশ্লেষণের প্রয়োজন হয় (যদি না আপনি সমস্ত সময় প্যাটার্নটি দেখেন)।

খাঁটি পারফরম্যান্সের দৃষ্টিকোণ থেকে, যেমনটি ইতিমধ্যে @ নওফালের উত্তরে দেওয়া হয়েছে, Enum.GetName()আরও ভাল।

পারফরম্যান্স যদি সত্যই আপনার লক্ষ্য হয় তবে আগে থেকে চেহারা (কোনও অভিধান বা অন্য কোনও ম্যাপিং ব্যবহার করে) দেওয়া আরও ভাল।

সি ++ / সিএলআই-তে এটি দেখতে ভালো লাগবে

Dictionary<String^, MyEnum> mapping;
for each (MyEnum field in Enum::GetValues(MyEnum::typeid))
{
    mapping.Add(Enum::GetName(MyEnum::typeid), field);
}

100 আইটেম এবং 1000000 পুনরাবৃত্তির একটি এনাম ব্যবহার করে তুলনা:

Enum.GetName: ms 800ms
.ToString (): ~ 1600ms
অভিধান ম্যাপিং: ~ 250ms


-3

সহজ: একটি তালিকায় enum নাম:

List<String> NameList = Enum.GetNames(typeof(YourEnumName)).Cast<string>().ToList()

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