c# - সি#এ Enum থেকে int মান পান




enums casting (17)

Enum রূপান্তর int পরিবর্তে এই এক চেষ্টা করুন:

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

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

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

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


Int বা ছোট enums সঙ্গে আমার fav হ্যাক:

GetHashCode();

একটি enum জন্য

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    

Disclaimer: দীর্ঘ উপর ভিত্তি করে enums জন্য কাজ করে না


অনুসরণ এক্সটেনশন পদ্ধতি

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

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

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

এই বর্তমান enum মান int int প্রাপ্ত হচ্ছে সরলীকৃত:

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

অথবা

int value = Question.Role.getNumberValue();

আমি সম্প্রতি সুরক্ষিত কনস্ট্রাক্টর এবং পূর্বনির্ধারিত স্ট্যাটিক দৃষ্টান্তগুলির সাথে ক্লাস ব্যবহার করে আমার কোডে enums ব্যবহার করে দূরে রূপান্তরিত করেছি। (Roelof - C # ধন্যবাদ বৈধ Enum Values ​​- Futureproof পদ্ধতি নিশ্চিত করুন )।

তার আলোকে, আমি এখন এই সমস্যাটির সাথে কিভাবে যোগাযোগ করবো (অন্তর্নিহিত রূপান্তর / 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)
}

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

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


উদাহরণ আমি 'enum থেকে int' মান পেতে 'পরামর্শ দিতে চাই,'

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

int answer = (int)Sample.Book;

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

আমি এই কেউ সাহায্য করতে পারে আশা করি।


একটি enum মান বিদ্যমান আছে এবং তারপরে এটি বিশদ নিশ্চিত করতে, আপনি নীচের কাজ করতে পারেন।

// 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() + ".");

আশা করি এটা কাজে লাগবে.


এটা চেষ্টা কর :

int value = YourEnum.ToString("D");

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

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

ফলাফল হবে:

Name: Role, Value: 2

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

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 হিসাবে এটি রেফারেন্স করতে পারেন। Role, এবং এটি সর্বদা একটি int মূল্যায়ন করে বা যা আপনি এটি হিসাবে সংজ্ঞায়িত করেন।


যদি আপনি একটি ভেরিয়েবলে সংরক্ষণ করা এননাম মানের জন্য পূর্ণসংখ্যা পেতে চান, তবে কোনও পদ্ধতিতে উদাহরণস্বরূপ ব্যবহার করার জন্য Question হবে 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 পরিবর্তন হবে।

ইন্টারনেটে এই সহজ সমাধান খোঁজার সময় আমার কাছে কঠিন ছিল এবং আমি এটি খুঁজে পাইনি, তাই আমি কিছু পরীক্ষা করছিলাম এবং এটি খুঁজে পেয়েছিলাম। আশাকরি এটা সাহায্য করবে. ;)


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

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

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

এই অন্তর্নিহিত অবিচ্ছেদ্য ধরনের নির্বিশেষে কাজ করা উচিত।


শুধু enum নিক্ষেপ, উদাহরণস্বরূপ

int something = (int) Question.Role;

উপরে আপনি বন্য মধ্যে দেখতে enums বিপুল সংখ্যক জন্য কাজ করবে, একটি enum জন্য ডিফল্ট অন্তর্নিহিত টাইপ int

তবে, cecilphillip পয়েন্ট হিসাবে, enums বিভিন্ন অন্তর্নিহিত ধরনের থাকতে পারে। যদি একটি uint ঘোষণা করা হয়, একটি uint , long , বা ulong , এটি ulong টাইপ করা উচিত; যেমন জন্য

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

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

long something = (long)StarsInMilkyWay.Wolf424B;

সম্পর্কিত নোটে, আপনি যদি System.Enum থেকে int মানটি পেতে চান তবে এখানে 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);

শেষ দুইটি কুৎসিত। আমি প্রথম এক পছন্দ।


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

... একটি জরিমানা ঘোষণা।

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

int Question = (int)QuestionType.Role

অন্যথা, টাইপ এখনও টাইপ টাইপ।

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

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

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

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


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

int number = Question.Role.GetHashCode();

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





int