এন # থেকে সি # তে অন্তর্গত মানটি পান


1821

আমার একটি ক্লাস রয়েছে Questions(বহুবচন)। এই শ্রেণিতে একটি এনাম রয়েছে Question(একবচন) যা দেখতে এটির মতো দেখাচ্ছে।

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

ইন Questionsবর্গ আমি আছে get(int foo)ফাংশন যে একটি ফেরৎ Questionsযে জন্য বস্তু foo। এনামের কাছ থেকে পূর্ণসংখ্যার মানটি পাওয়ার সহজ উপায় কি আমি এরকম কিছু করতে পারি Questions.Get(Question.Role)?



11
আমি জানি যে আমি পার্টিতে দেরি করেছি, তবে আপনার পদ্ধতিটি সংজ্ঞায়িত করার পরিবর্তে get(int foo)আপনি যেমন get(Question foo)পদ্ধতিটির অভ্যন্তরে Questions.Get(Question.Role)
জো

উত্তর:


2350

শুধু এনাম castালাই, যেমন

int something = (int) Question.Role;

উপরের অংশটি আপনি বন্য অঞ্চলে দেখতে পান এমন অনেকগুলি এনামের জন্য কাজ করবে, যেমন কোনও এনামের জন্য ডিফল্ট অন্তর্নিহিত ধরণ রয়েছে int

তবে, সিসিলিফিলিপ হিসাবে উল্লেখ করা হয়েছে, এনামগুলিতে বিভিন্ন অন্তর্নিহিত ধরণের থাকতে পারে। একটি enum একটি হিসেবে ঘোষণা করা হয়, তাহলে uint, longঅথবা ulong, এটা enum ধরণ কাস্ট করা উচিত; যেমন

enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649};

আপনার ব্যবহার করা উচিত

long something = (long)StarsInMilkyWay.Wolf424B;

23
@ হ্যারি এটা সত্য নয় আপনি ingালাই ছাড়াই গণনা তৈরি করতে পারেন, এটির প্রয়োজন নেই। এবং আমি কেবল বিশেষ ক্ষেত্রে কেবলমাত্র নম্বরটি নির্দিষ্ট করি, বেশিরভাগ সময় আমি এটিকে ডিফল্ট মান হিসাবে রেখে দিই। তবে আপনি এটি করতে পারেন enum Test { Item = 1 }এবং দেখতে পারেন যে 1 == (int)Test.Itemসমান।
জয়দার

33
@ জায়েদার (int)Test.Itemএটি কাস্ট! () হ'ল সুস্পষ্ট কাস্ট অপারেটর।
সিনথিয়া ভি

48
@ সীতিয়া ভি তিনি বলেছেন যে আপনি এটি castালাই ছাড়াই তৈরি করতে পারবেন , যা সঠিক
পল রিডওয়ে

7
অন্তর্নিহিত প্রকারটি যদি enum Questionনা হয় intতবে longএই castালাইয়ের Roleঅবিচ্ছেদ্য মান কেটে যাবে !
কয়েলার

1
আপনি যখন Enumকোনও প্যারামিটার হিসাবে গ্রহণ করেন , আপনি জানেন যে কেবলমাত্র সম্ভাব্য ইন্টিগ্রাল মানগুলিই আপনি পেতে পারেন fixed অন্যদিকে, আপনি যদি সহজভাবে একটি গ্রহণ করেন intতবে আপনাকে যদি তা intস্বীকৃত মানগুলির মধ্যে থাকে তবে আপনাকে বৈধতা দিতে হবে , সুতরাং কোডটিকে জটিল করে তোলা। আপনি সর্বদা আপনার স্বাক্ষরগুলিকে r `` পাবলিক অকার্যকর মাইমেথোড (ইনট এক্স) {// এক্স-পাবলিক শূন্য মাইমেথোদ (এনাম এক্স) দিয়ে কিছু করুন {এটি .মাইমথোড ((ইনট্রেশন এক্স)); } `` ``
পেরেসবাস

307

যেহেতু Enums কোন অবিচ্ছেদ্য ধরনের হতে পারে ( byte, int, short, ইত্যাদি), enum অন্তর্নিহিত অবিচ্ছেদ্য মান পেতে একটি আরো জোরালো ভাবে ব্যবহার করতে হবে GetTypeCodeসাথে পদ্ধতি Convertশ্রেণী:

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

অন্তর্নিহিত ইন্টিগ্রাল ধরণের নির্বিশেষে এটিকে কাজ করা উচিত।


32
এই কৌশলটি জেনেরিক টাইপের সাথে যখন টি: এনাম (আসলে টি: স্ট্রাক্ট, আইকনভার্টেবল তবে এটি ভিন্ন গল্প) নিয়ে কাজ করার সময় আমার পক্ষে তার মূল্য প্রমাণ করেছে।
aboy021

1
পাশের হেক্সাডেসিমাল মানটি প্রিন্ট করতে আপনি কীভাবে এটি সংশোধন করবেন? এই উদাহরণটি দশমিক মান দেখায়। সমস্যাটি হ'ল varধরণের object, সুতরাং আপনার এটি আনবক্স করা দরকার এবং এটি আমার ইচ্ছার চেয়ে মেসে ওঠে।
Lakata

2
আমার মনে হয় আপনি উদাহরণস্বরূপ পরিবর্তন করা উচিত আপনার উদাহরণে সবসময় হতে হবে । object val = Convert...etcvarobject
জাল করুন

2
@ টিমবেল আমি সত্যিই যা বলতে পারি তা হ'ল আমরা দেখতে পেলাম যে ডায়নামিকভাবে সংকলিত এসপেক্স পৃষ্ঠা (যেখানে আপনাকে লাইভ সার্ভারে .cs ফাইলগুলি স্থাপন করতে হবে) প্রতিটি মানের জন্য পৃথক পৃথক স্থান নির্ধারণ করে যাচ্ছিল। এর অর্থ হ'ল সিরিয়ালাইজড অবজেক্টস একটি একটি মেশিন, আলাদা আলাদা মেশিনে বিভিন্ন মান নিয়ে ডিসেসরিজিং করছিল এবং কার্যকরভাবে দূষিত হচ্ছিল ( ঘন্টাখানেক বিভ্রান্তির কারণ)। আমরা এটি এমএস দিয়ে উত্থাপিত করেছি এবং আমি মনে করি তারা মনে করে বলেছিল যে বিভিন্ন কাঠামোর সংস্করণ জুড়ে নির্মিত স্বয়ংক্রিয়তাযুক্ত পূর্ণসংখ্যাগুলি একই হওয়ার নিশ্চয়তা ছিল না।
নিকজি

4
@ টিমএবেল একটি পৃথক উপলক্ষে, একজন বিকাশকারী একটি অপ্রচলিত / অব্যবহৃত এনাম মান মুছে ফেলে যার ফলে ক্রমের অন্যান্য সমস্ত মান একের পর এক হয়ে যায়। যেমনটি, এখন আমাদের কোডিং মানগুলির প্রয়োজন যে আইডি সর্বদা স্পষ্টভাবে নির্দিষ্ট করা উচিত, অন্যথায় কোড যুক্ত / মোছা বা এমনকি স্বতঃ-বিন্যাস কোড (যেমন বর্ণানুক্রমিকভাবে বাছাই করা) ডেটা দুর্নীতি সৃষ্টিকারী সমস্ত মান পরিবর্তন করবে। আমি কাউকে দৃ En়ভাবে সমস্ত এনাম পূর্ণসংখ্যা স্পষ্টভাবে নির্দিষ্ট করার পরামর্শ দেব। এটি অতি-গুরুত্বপূর্ণ যদি তারা বাহ্যিকভাবে (ডাটাবেস) সঞ্চিত মানগুলির সাথে সম্পর্কিত হন।
নিকজি

199

এটি স্থির শ্রেণি হিসাবে জনসাধারণের প্রতিবন্ধক হিসাবে ঘোষণা করুন:

public static class Question
{
    public const int Role = 2;
    public const int ProjectFunding = 3;
    public const int TotalEmployee = 4;
    public const int NumberOfServers = 5;
    public const int TopBusinessConcern = 6;
}

এবং তারপরে আপনি এটিকে হিসাবে উল্লেখ করতে পারেন Question.Roleএবং এটি সর্বদা একটি intবা যা আপনি এটি নির্ধারণ করেন তার মূল্যায়ন করে ।


31
আমি ব্যবহার করব static readonly intকারণ ধ্রুবকগুলি তাদের শক্ত মানগুলিতে সংকলিত হয়। স্ট্যাকওভারফ্লো.com
সিএডি ব্লোক

96
এই সমাধানটি দৃ strongly়ভাবে টাইপ করা এনামগুলির প্রকৃত সুবিধা দেয় না। যদি আমি উদাহরণস্বরূপ কেবল একটি নির্দিষ্ট পদ্ধতিতে গেমস্টেট-এনাম-প্যারামিটারটি পাস করতে চাইতাম তবে সংকলকটি আমাকে পরামিতি হিসাবে কোনও ইনট-ভেরিয়েবল পাস করার অনুমতি দেবে না।
thgc

12
@ কেএডব্লোক যা অবিকল আপনি কেন ব্যবহার করবেন constএবং না static readonlyকারণ প্রতিবার আপনি static readonlyযখন ভেরিয়েবলের মান পেতে একটি পদ্ধতি কল constকরছেন তার তুলনায় আপনি সরাসরি দুটি মানের ধরণের তুলনা করছেন।

3
@ ব্রেটটোফ ৮ Yes হ্যাঁ, একটি কনস্টের দ্রুততর হবে, যদি সংকলনের সীমাবদ্ধতা কখনই সমস্যা না করে তবে সব কিছু ভাল।
সিএডি

2
@ জ্যাক আমি এটিকে খুব ভালভাবে ব্যাখ্যা করতে পারি নি, compilation limitationআমার অর্থ এই যে আপনি যখন এটি সংকলন করেন তখন মানটি হার্ড-কোডড হয় তাই সেই মানটিতে যে কোনও পরিবর্তন করা দরকার যে এটি ব্যবহার করে সমস্ত সমাবেশগুলি পুনরায় সংযুক্ত করা দরকার। আমি ব্যবহার সম্পর্কে আপনার সাথে একমত হতে আগ্রহী কারণ মান পরিবর্তন করা সুদূরপ্রসারী প্রভাব ফেলবে।
সিএডি

87
Question question = Question.Role;
int value = (int) question;

ফলাফল হবে value == 2


34
অস্থায়ী পরিবর্তনশীল প্রশ্নটি অপ্রয়োজনীয়।
গিশু

1
এই Questions.Get ভালো কিছু (Convert.ToInt16 (Question.Applications)) সুতরাং
জিম

6
আপনি কেবল উভয় দিকে কাস্ট করতে পারেন; কেবলমাত্র দেখার বিষয় হ'ল এনামগুলি কোনও কিছু প্রয়োগ করে না (এনামের মান 288 হতে পারে, যদিও এই সংখ্যাটির সাথে কোনও প্রশ্ন উপস্থিত নেই)
মার্ক গ্রাভেল

@ জিম: না, স্রেফ মানটি দিন: প্রশ্নাগুলি (পান) প্রশ্ন.আপনিফিকেশনস;
গুফা

1
@ গিশু আপনি বলতে পারেন এটি ... প্রশ্নবিদ্ধ। ;)
ফেলিক্স ডি

79

সম্পর্কিত নোটের উপর, আপনি যদি intমানটি পেতে চান System.Enumতবে eএখানে এখানে দিন:

Enum e = Question.Role;

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

int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);

শেষ দুটি সরল কদর্য। আমি প্রথমটিকে পছন্দ করি।


1
দ্বিতীয়টি যদিও দ্রুততম।
জোহান বি

1
যে কেউ মিনক্রাফ্ট মোডিংয়ে মিক্সিন ব্যবহার করতে অভ্যস্ত, দ্বিতীয়টিকে সুস্পষ্ট বিজয়ীর মতো মনে হচ্ছে।
Sollace

40

এটি আপনার ভাবার চেয়ে সহজ - একটি এনাম ইতিমধ্যে একটি অন্তর্নিহিত। এটি কেবল মনে করিয়ে দেওয়া দরকার:

int y = (int)Question.Role;
Console.WriteLine(y); // Prints 2

15
নিতপিক: এই এনাম ইতিমধ্যে একটি অন্তর্নিহিত । অন্যান্য এনামগুলি বিভিন্ন ধরণের হতে পারে - "এনাম স্মলইনাম: বাইট {এ, বি, সি}" চেষ্টা করুন
এমকিপিপি

9
পুরোপুরি সঠিক. সি # রেফারেন্স: "প্রতিটি অঙ্কের ধরণের একটি অন্তর্নিহিত ধরণ থাকে যা চর ছাড়া অন্য কোনও অবিচ্ছেদ্য প্রকার হতে পারে" "
মাইকেল পেট্রোটা

33

উদাহরণ:

public Enum EmpNo
{
    Raj = 1,
    Rahul,
    Priyanka
}

এনাম মান পেতে পিছনের কোডটিতে:

int setempNo = (int)EmpNo.Raj; // This will give setempNo = 1

অথবা

int setempNo = (int)EmpNo.Rahul; // This will give setempNo = 2

এনামগুলি 1 দ্বারা বৃদ্ধি পাবে এবং আপনি সূচনা মান সেট করতে পারেন। যদি আপনি শুরু মান সেট না করেন তবে এটি প্রাথমিকভাবে 0 হিসাবে নির্ধারিত হবে।


6
এটি কি আসলে সংকলন করে?
পিটার মর্টেনসেন

রাজ এমন কিছু কি রাহুল বা প্রিয়াঙ্কাও হতে পারে? আপনার মানগুলি দ্বন্দ্বযুক্ত এবং দ্বিগুণ হওয়া উচিত অনন্য হতে যেমন উদাহরণস্বরূপ 0, 1, 2, 4, 8 ইত্যাদি etc.
টিমোথি গঞ্জালেজ

@ টিমোথিগনজালেজ প্রকৃতপক্ষে enums কেবল 1 টি গণনা করুন যদি আপনি তাদের মানটি স্পষ্টভাবে উল্লেখ না করেন;)
derHugo

@ এডার হুগো এটি নির্ভর করে যে আপনি যদি সংখ্যার মানগুলি বেস 10 বা বেস 2 হিসাবে ধরে নেন তবে
তীমথিয় গনজালেজ

@TimothyGonzalez ভাল নেই অনেক অনুমান করা ... আমি শুধু উল্লেখ করেছিলেন যে, ডিফল্টরূপে তারা শুধু আপ গণনা করি 1intছাড়া আপনি স্পষ্টভাবে অন্যথায় সংজ্ঞায়িত
derHugo

28

আমি সম্প্রতি সুরক্ষিত কনস্ট্রাক্টর এবং পূর্বনির্ধারিত স্ট্যাটিক দৃষ্টান্তগুলির সাথে ক্লাসগুলি ব্যবহার করার পক্ষে ( কোডটি রইলফ - সি # বৈধ এনাম মানগুলি - ফিউচারপ্রুফ পদ্ধতি ) ধন্যবাদ দিয়ে আমার কোডটিতে এনাম ব্যবহার করা থেকে সরে গিয়েছি

এর আলোকে, নীচে আমি এখন কীভাবে এই সমস্যাটির কাছে যাব (এতে / থেকে অন্তর্ভুক্ত রূপান্তর সহ int)।

public class Question
{
    // Attributes
    protected int index;
    protected string name;
    // Go with a dictionary to enforce unique index
    //protected static readonly ICollection<Question> values = new Collection<Question>();
    protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>();

    // Define the "enum" values
    public static readonly Question Role = new Question(2,"Role");
    public static readonly Question ProjectFunding = new Question(3, "Project Funding");
    public static readonly Question TotalEmployee = new Question(4, "Total Employee");
    public static readonly Question NumberOfServers = new Question(5, "Number of Servers");
    public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern");

    // Constructors
    protected Question(int index, string name)
    {
        this.index = index;
        this.name = name;
        values.Add(index, this);
    }

    // Easy int conversion
    public static implicit operator int(Question question) =>
        question.index; //nb: if question is null this will return a null pointer exception

    public static implicit operator Question(int index) =>        
        values.TryGetValue(index, out var question) ? question : null;

    // Easy string conversion (also update ToString for the same effect)
    public override string ToString() =>
        this.name;

    public static implicit operator string(Question question) =>
        question?.ToString();

    public static implicit operator Question(string name) =>
        name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));


    // If you specifically want a Get(int x) function (though not required given the implicit converstion)
    public Question Get(int foo) =>
        foo; //(implicit conversion will take care of the conversion for you)
}

এই পদ্ধতির সুবিধাটি হ'ল এনাম থেকে আপনার যা কিছু আছে তা পেয়ে যান তবে আপনার কোডটি এখন আরও নমনীয় so তাই আপনার মানটির ভিত্তিতে বিভিন্ন ক্রিয়া সম্পাদন করা উচিত Question, আপনি Questionনিজের মধ্যে যুক্তি স্থাপন করতে পারেন (যেমন পছন্দসই ওওতে) ফ্যাশন) প্রতিটি দৃশ্যের মোকাবেলায় আপনার কোড জুড়ে প্রচুর কেস স্টেটমেন্ট দেওয়ার বিপরীতে।


এনবি: সি # 6 বৈশিষ্ট্যগুলি ব্যবহার করতে উত্তর 2018-04-27 আপডেট হয়েছে; অর্থাত্ ঘোষণার এক্সপ্রেশন এবং ল্যাম্বডা এক্সপ্রেশন বডি সংজ্ঞা। মূল কোডের জন্য পুনর্বিবেচনা ইতিহাস দেখুন See এর সংজ্ঞাটি একটু কম ভার্বোস করার সুবিধা রয়েছে; যা এই উত্তরের পদ্ধতির সম্পর্কে অন্যতম প্রধান অভিযোগ ছিল।


2
আমি অনুমান করি যে এটি সুস্পষ্ট কাস্ট এবং কোডটি লিখতে হবে এটির মধ্যে বাণিজ্য বন্ধ। তবুও বাস্তবায়ন পছন্দ করুন কেবল কামনা করুন এটি এত দীর্ঘ ছিল না। +1
লঙ্কাইমার্ট

3
আমি এর অনুরূপ কাঠামোগত বিভিন্ন ধরণের ক্লাস ব্যবহার করেছি। "পরে আমাকে মূর্খ হতে দেবেন না" পদ্ধতিটি অনুসরণ করার চেষ্টা করার সময় তারা আশ্চর্য হয়ে যায়।
জেমস হাগ

20

আপনি যদি ভেরিয়েবলের মধ্যে থাকা এনাম মানটির জন্য একটি পূর্ণসংখ্যা পেতে চান, যার জন্য এই ধরণটি হবে Questionকোনও পদ্ধতিতে উদাহরণস্বরূপ ব্যবহার করতে, আপনি কেবল এই উদাহরণটিতে লিখেছেন এটি করতে পারেন:

enum Talen
{
    Engels = 1, Italiaans = 2, Portugees = 3, Nederlands = 4, Duits = 5, Dens = 6
}

Talen Geselecteerd;    

public void Form1()
{
    InitializeComponent()
    Geselecteerd = Talen.Nederlands;
}

// You can use the Enum type as a parameter, so any enumeration from any enumerator can be used as parameter
void VeranderenTitel(Enum e)
{
    this.Text = Convert.ToInt32(e).ToString();
}

এই 4 উইণ্ডো শিরোনামের সাথে পরিবর্তন করতে হবে কারণ পরিবর্তনশীল Geselecteerdহয় Talen.Nederlands। যদি আমি এটিকে পরিবর্তন করে Talen.Portugeesএবং পদ্ধতিটিকে আবার কল করি তবে পাঠ্যটি 3 এ পরিবর্তিত হবে।


3
ডাচ কোডিং ওহ প্রিয়।
ওয়াইজস্ট্রাবেরি

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

16

এনাম মান বিদ্যমান এবং তা বিশদকরণ নিশ্চিত করতে আপনি নিম্নলিখিতগুলিও করতে পারেন।

// Fake Day of Week
string strDOWFake = "SuperDay";

// Real Day of Week
string strDOWReal = "Friday";

// Will hold which ever is the real DOW.
DayOfWeek enmDOW;

// See if fake DOW is defined in the DayOfWeek enumeration.
if (Enum.IsDefined(typeof(DayOfWeek), strDOWFake))
{
    // This will never be reached since "SuperDay"
    // doesn't exist in the DayOfWeek enumeration.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWFake);
}
// See if real DOW is defined in the DayOfWeek enumeration.
else if (Enum.IsDefined(typeof(DayOfWeek), strDOWReal))
{
    // This will parse the string into it's corresponding DOW enum object.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal);
}

// Can now use the DOW enum object.
Console.Write("Today is " + enmDOW.ToString() + ".");

14

হতে পারে আমি এটি মিস করেছি, তবে কেউ কি সাধারণ জেনেরিক এক্সটেনশন পদ্ধতির চেষ্টা করেছে?

এটি আমার পক্ষে দুর্দান্ত কাজ করে। আপনি আপনার এপিআই-তে প্রকারের কাস্ট এড়াতে পারেন তবে শেষ পর্যন্ত এটির পরিবর্তনের ধরণের অপারেশনের ফলাফল। এই প্রোগ্রামিং একটি ভাল ক্ষেত্রে দেখা যায় Roslyn আছে কম্পাইলার আপনার জন্য একটি GetValue <টি> পদ্ধতি আছে।

    public static void Main()
    {
        int test = MyCSharpWrapperMethod(TestEnum.Test1);

        Debug.Assert(test == 1);
    }

    public static int MyCSharpWrapperMethod(TestEnum customFlag)
    {
        return MyCPlusPlusMethod(customFlag.GetValue<int>());
    }

    public static int MyCPlusPlusMethod(int customFlag)
    {
        // Pretend you made a PInvoke or COM+ call to C++ method that require an integer
        return customFlag;
    }

    public enum TestEnum
    {
        Test1 = 1,
        Test2 = 2,
        Test3 = 3
    }
}

public static class EnumExtensions
{
    public static T GetValue<T>(this Enum enumeration)
    {
        T result = default(T);

        try
        {
            result = (T)Convert.ChangeType(enumeration, typeof(T));
        }
        catch (Exception ex)
        {
            Debug.Assert(false);
            Debug.WriteLine(ex);
        }

        return result;
    }
}

সম্ভবত (অন্তর্ভুক্ত) কাস্টমফ্ল্যাগ করা চারপাশে কম টাইপ করা হচ্ছে এবং একই জিনিস কমবেশি কম হয়?
টিম কেটিং

পুনরায় "সম্ভবত আমি এটি মিস করেছি, তবে কেউ কি সাধারণ জেনেরিক এক্সটেনশন পদ্ধতির চেষ্টা করেছে ?" : সিক্সটহ্রি " পরিবর্তে একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন" বলেছিলেন এবং ব্রোনেক বলেছিলেন "আপনি আপনার সংজ্ঞায়িত এনাম ধরণের ক্ষেত্রে একটি এক্সটেনশন পদ্ধতি প্রয়োগ করে এটি করতে পারেন "
পিটার মর্টেনসেন

13

এটি করার আরও একটি উপায়:

Console.WriteLine("Name: {0}, Value: {0:D}", Question.Role);

এটির ফলাফল হবে:

Name: Role, Value: 2

12
public enum QuestionType
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

... একটি সূক্ষ্ম ঘোষণা।

আপনাকে ফলাফলটি এভাবে পছন্দ করতে হবে:

int Question = (int)QuestionType.Role

অন্যথায়, টাইপ এখনও আছে QuestionType

কঠোরতার এই স্তরটি সি # উপায়।

এর পরিবর্তে একটি শ্রেণীর ঘোষণা ব্যবহার করা একটি বিকল্প:

public class QuestionType
{
    public static int Role = 2,
    public static int ProjectFunding = 3,
    public static int TotalEmployee = 4,
    public static int NumberOfServers = 5,
    public static int TopBusinessConcern = 6
}

এটি ঘোষণার জন্য কম মার্জিত নয় তবে আপনার কোডে এটি কাস্ট করার দরকার নেই:

int Question = QuestionType.Role

বিকল্পভাবে, আপনি ভিজ্যুয়াল বেসিকটির সাথে আরও স্বাচ্ছন্দ্য বোধ করতে পারেন যা অনেক ক্ষেত্রে এই ধরণের প্রত্যাশা পূরণ করে।


11
int number = Question.Role.GetHashCode();

numberমান থাকা উচিত 2


গ্যানহ্যাশকোড এনুম কমন মাস্কের কাছ থেকে মূল্য পাওয়ার এক উপায়
থানহুলডি

লক্ষ্য করুন এই জন্য কেবল "পাঠ্য" হয় bool*, byte, ushort, int, এবং uint**। অন্যান্য ধরণের গেটহ্যাশকোড মানটি সংশোধন করে, উদাহরণস্বরূপ কিছু বিটশিফ্ট এবং জোরস করে। (* 1/0, ** অবশ্যই কোর্সে কাস্ট করা হয়েছে)। আপনার নিজের ব্যক্তিগত কোড না থাকলে তবে সব মিলিয়ে এটি করবেন না।
আনোরজাকেন

10

আপনি আপনার সংজ্ঞায়িত এনাম প্রকারে একটি এক্সটেনশন পদ্ধতি প্রয়োগ করে এটি করতে পারেন :

public static class MyExtensions
{
    public static int getNumberValue(this Question questionThis)
    {
        return (int)questionThis;
    }
}

এটি বর্তমান এনাম মানটির অন্তর্গত মানটি সহজ করে তোলে:

Question question = Question.Role;
int value = question.getNumberValue();

অথবা

int value = Question.Role.getNumberValue();

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

2
বেঞ্জামিন, প্রথমত, আপনি কেন আমার মন্তব্যটি মুছে ফেললেন? আমি আপনার সিদ্ধান্তগুলি বুঝতে পারি না maybe সম্ভবত সম্প্রদায়ের কেউ কেউ আমার মন্তব্যের সাথে একমত হতে পারে ec দ্বিতীয়ত, আমার সমাধানটি টেটেরুনট্রনের একটিকে জড়িয়ে দেয় এবং সঠিকভাবে এটি সহজ এবং কম লেখা কারণ একটি ইন্টেলিজেন্স দ্বারা এক্সটেনশন পদ্ধতিটি প্রস্তাবিত S সুতরাং আমি মনে করি আপনার সিদ্ধান্তটি নিরপেক্ষ ও প্রতিনিধিত্বমূলক নয় St স্ট্যাকের বিষয়ে আমি অনেকগুলি অনুরূপ উত্তর দেখতে পাচ্ছি এবং এটি ঠিক আছে। যাইহোক আমি আমার সমাধানটি ব্যবহার করি এবং সম্ভবত কিছু লোক রয়েছে ভবিষ্যতে আমার সমাধানটি বেছে নেবে, তবে এই নেতিবাচক পয়েন্টগুলি অনুসন্ধান করা আরও শক্ত করে তোলে all সর্বোপরি এটি সঠিক এবং অনুলিপি নয়।
ব্রোনেক

3
@ ব্রোনেক আপনি যদি আমাকে পিং করেন না তবে আপনি যে উত্তর দিয়েছেন সে বিষয়ে আমি কোনও ইঙ্গিত পাই না। আমি হয়নি না আপনার মন্তব্যটি মুছে আমি ক্ষমতা নেই তাই বা কাজ করতে চান। সম্ভবত একটি মোড এসেছিল এবং এটি মুছে ফেলেছিল - আপনাকে মডারেটরের মনোযোগের জন্য এটি পতাকাঙ্কিত করতে স্বাগত জানাই এবং কেন বা আরও ভাল - মেটাক স্ট্যাক ওভারফ্লোতে জিজ্ঞাসা করুন । আমি আপনার প্রোগ্রামিং স্ট্যান্ড পয়েন্ট থেকে আপনার সমাধান সম্পর্কে একটি মতামত যা আমার ডান দিক থেকে পুরোপুরি - এই মন্তব্যগুলি শুরু হয়, এটি ব্যক্তিগত নিতে হবে না।
বেনিয়ামিন গ্রুইনবাউম

8

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

public static class ExtensionMethods
{
    public static int IntValue(this Enum argEnum)
    {
        return Convert.ToInt32(argEnum);
    }
}

এবং ব্যবহার সামান্য সুন্দর:

var intValue = Question.Role.IntValue();

7
public enum Suit : int
{
    Spades = 0,
    Hearts = 1,
    Clubs = 2,
    Diamonds = 3
}

Console.WriteLine((int)(Suit)Enum.Parse(typeof(Suit), "Clubs"));

// From int
Console.WriteLine((Suit)1);

// From a number you can also
Console.WriteLine((Suit)Enum.ToObject(typeof(Suit), 1));

if (typeof(Suit).IsEnumDefined("Spades"))
{
    var res = (int)(Suit)Enum.Parse(typeof(Suit), "Spades");
    Console.Out.WriteLine("{0}", res);
}

স্যুট - "১০. (কার্ড গেমস) রঙের এবং / অথবা নির্দিষ্ট চিহ্নগুলির দ্বারা আলাদা আলাদা আলাদা কার্ডের প্যাকেটের প্রতিটি সেট যেমন কোদাল, হৃদয়, হীরা বা traditionalতিহ্যবাহী অ্যাংলো, হিস্পানিক এবং ফরাসী প্লেিং কার্ডগুলির ক্লাব।"
পিটার মর্টেনসেন

নমুনা কোডের একটি ব্যাখ্যা ক্রমযুক্ত হবে ( আপনার উত্তর সম্পাদনা করে , মন্তব্যগুলিতে এখানে নয়)।
পিটার মর্টেনসেন

শূন্য সাধারণত এনামগুলিতে আনসেট / অচেতন রাষ্ট্রের জন্য সংরক্ষিত থাকে, এটির মতো এটি সংজ্ঞায়িত করা অস্বাভাবিক
চাদ গ্রান্ট

6

ব্যবহার করুন:

Question question = Question.Role;
int value = question.GetHashCode();

এটি ফলাফল হবে value == 2

এটি শুধুমাত্র সত্য যদি এনামের ভিতরে এনাম ফিট হয় int


1
এটি শুধুমাত্র সত্য যদি এনাম intঅবশ্যই কোনও অভ্যন্তরের সাথে ফিট করে GetHashCode
আরবি।

5

যেহেতু এনামগুলি একাধিক আদিম ধরণের দ্বারা ঘোষিত করা যায়, তাই কোনও এনাম টাইপ করার জন্য জেনেরিক বর্ধন পদ্ধতি কার্যকর হতে পারে।

enum Box
{
    HEIGHT,
    WIDTH,
    DEPTH
}

public static void UseEnum()
{
    int height = Box.HEIGHT.GetEnumValue<int>();
    int width = Box.WIDTH.GetEnumValue<int>();
    int depth = Box.DEPTH.GetEnumValue<int>();
}

public static T GetEnumValue<T>(this object e) => (T)e;

4

নিম্নলিখিতটি এক্সটেনশন পদ্ধতি

public static string ToEnumString<TEnum>(this int enumValue)
{
    var enumString = enumValue.ToString();
    if (Enum.IsDefined(typeof(TEnum), enumValue))
    {
        enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
    }
    return enumString;
}

4

ইন্ট বা ছোট এনামগুলির সাথে আমার প্রিয় হ্যাক:

GetHashCode();

একটি এনামের জন্য

public enum Test
{
    Min = Int32.MinValue,
    One = 1,
    Max = Int32.MaxValue,
}

এই,

var values = Enum.GetValues(typeof(Test));

foreach (var val in values)
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

আউটপুট

one
1
1
max
2147483647
2147483647
min
-2147483648
-2147483648

দাবি পরিত্যাগী:

এটি দীর্ঘ ভিত্তিতে এনামগুলির জন্য কাজ করে না।


3

সবচেয়ে সহজ সমাধান যা আমি ভাবতে পারি তা হ'ল Get(int)পদ্ধতিটি ওভারলোড করা :

[modifiers] Questions Get(Question q)
{
    return Get((int)q);
}

যেখানে [modifiers]সাধারণত Get(int)পদ্ধতি হিসাবে একই হতে পারে । আপনি যদি Questionsশ্রেণিটি সম্পাদনা করতে না পারেন বা কোনও কারণে না চান তবে আপনি একটি এক্সটেনশন লিখে পদ্ধতিটি ওভারলোড করতে পারেন:

public static class Extensions
{
    public static Questions Get(this Questions qs, Question q)
    {
        return qs.Get((int)q);
    }
}

3

"উদাহরণস্বরূপ আমি একটি এনম থেকে একটি 'অন্তর্গত মান পেতে" পরামর্শ দিতে চাই, এটি

public enum Sample
{
    Book = 1, 
    Pen = 2, 
    Pencil = 3
}

int answer = (int)Sample.Book;

এখন উত্তর হবে 1।



2

এনাম রূপান্তর করার পরিবর্তে এটি ব্যবহার করে দেখুন:

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}

2

ভিজ্যুয়াল বেসিকটিতে এটি হওয়া উচিত:

Public Enum Question
    Role = 2
    ProjectFunding = 3
    TotalEmployee = 4
    NumberOfServers = 5
    TopBusinessConcern = 6
End Enum

Private value As Integer = CInt(Question.Role)

3
প্রশ্নটি সি # এর জন্য।
Ctrl এস

2
শিরোনাম বলেছেন "C # enum থেকে int- এ মান পান"
পিটার মর্টেনসেন

0

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

public static class EnumEx
{
    public static dynamic Value(this Enum e)
    {
        switch (e.GetTypeCode())
        {
            case TypeCode.Byte:
            {
                return (byte) (IConvertible) e;
            }

            case TypeCode.Int16:
            {
                return (short) (IConvertible) e;
            }

            case TypeCode.Int32:
            {
                return (int) (IConvertible) e;
            }

            case TypeCode.Int64:
            {
                return (long) (IConvertible) e;
            }

            case TypeCode.UInt16:
            {
                return (ushort) (IConvertible) e;
            }

            case TypeCode.UInt32:
            {
                return (uint) (IConvertible) e;
            }

            case TypeCode.UInt64:
            {
                return (ulong) (IConvertible) e;
            }

            case TypeCode.SByte:
            {
                return (sbyte) (IConvertible) e;
            }
        }

        return 0;
    }

দয়া করে না, আপনি এই সমস্ত কিছুই এক লাইনে রূপান্তর করতে পারেন han চ্যাঞ্জেটটাইপ (e, e.GetTypeCode ()) এবং কোনও বস্তু ফিরে পেতে পারেন, গতিশীলতা বা কোনও এক্সটেনশন পদ্ধতির দরকার নেই
চাদ গ্রান্ট

রূপান্তর ব্যবহারের সাথে আমি দ্বিমত পোষণ করব। কেবল একটি castালাই ব্যবহার করা আরও সহজ হবে। আমার উদ্দেশ্যটি হ'ল কোনও কাস্ট ব্যবহার না করে কোনও এনামকে এর মানতে রূপান্তর করতে সক্ষম হবেন। এটি এনাম প্রকারের সাথে সম্পর্কিত সমস্ত ক্যাসেটকে পরিবর্তিত করতে পারে - তবে এটি কখন ঘটে ?. এক্সটেনশন পদ্ধতিটি সঠিকভাবে কাজ করে। যাইহোক, এটিতে আমার এতে একটি সমস্যা রয়েছে, যেহেতু এটি গতিশীল, কমপ্লায়ার চেক টাইপ করতে পারবেন না (পুরো বিবৃতিতে স্পষ্টতই) যার অর্থ রান চলাকালীন টাইপ চেকিং ঘটে - একটি ভাল সমাধান নয়। আমি মনে করি আমি আবার ক্যাসটে যাব।
জেফ

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