C # හි එනූම් වෙතින් int අගය ලබා ගන්න


1840

මට 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)
ජෝ

Answers:


2377

එනූම් දමන්න, උදා

int something = (int) Question.Role;

ඉහත සඳහන් කළ පරිදි ඔබ වනයේ දකින එනූම් වලින් බහුතරයක් සඳහා ක්‍රියා කරනු intඇත.

කෙසේ වෙතත්, සිසිල් ෆිලිප් පෙන්වා දෙන පරිදි, එනුම් වලට විවිධ යටින් පවතින වර්ග තිබිය හැකිය. එනමාවක් a ලෙස ප්‍රකාශයට පත් කරන්නේ නම් uint, longහෝ ulong, එය එනුම් වර්ගයට දැමිය යුතුය; උදා

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

ඔබ භාවිතා කළ යුතුයි

long something = (long)StarsInMilkyWay.Wolf424B;

23
- හැරී එය සත්‍ය නොවේ. වාත්තු කිරීමකින් තොරව ඔබට ගණන් කිරීම නිර්මාණය කළ හැකිය, එය අවශ්‍ය නොවේ. මම විශේෂ අවස්ථා වලදී පමණක් අංකය පවරමි, බොහෝ විට මම එය පෙරනිමි අගය ලෙස තබමි. නමුත් ඔබට එය කළ හැකි enum Test { Item = 1 }අතර 1 == (int)Test.Itemඑය සමාන බව පෙනේ .
ජයිඩර්

33
A ජයිඩර් (int)Test.Itemඑය වාත්තු කිරීමකි! () යනු පැහැදිලි වාත්තු ක්‍රියාකරු වේ.
සින්තියා වී

48
In සින්තියා V ඔහු පැවසුවේ ඔබට එය වාත්තු නොකර නිර්මාණය කළ හැකි බවයි, එය නිවැරදියි
පෝල් රිඩ්වේ

7
සඳහා පාදක වු වර්ගය නම් enum Questionනොවේ intනමුත් longමෙම කාස්ට් ලුප්ත ඇත Roleඅවියෝජනීය අගය ගේ!
quaylar

1
ඔබ Enumපරාමිතියක් ලෙස පිළිගත් විට , ඔබ දන්නවා ඔබට ලබා ගත හැකි අනුකලනය කළ හැකි අගයන් ස්ථාවර සංඛ්‍යාවක් පමණි. අනෙක් අතට, ඔබ හුදෙක් එකක් intගතහොත්, intඑය පිළිගත් අගයන් තුළ තිබේ නම් ඔබ එය වලංගු කළ යුතුය . එමඟින් කේතය සංකීර්ණ වේ. ඔබට සැමවිටම ඔබේ අත්සන අභිබවා යා හැකිය `` `පොදු අවලංගු MyMethod (int x) {// x} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``
සංජානනය

309

Enums ඕනෑම අවියෝජනීය වර්ගය (විය හැකි බැවින් byte, int, short, ආදිය), නිඛිල යටින් පවතින අවියෝජනීය අගය ලබා ගැනීමට වඩාත් ශක්තිමත් ආකාරයෙන් යොදා ගැනීමට වනු ඇත GetTypeCodeසමග සහයෝගීව ක්රමය Convertපන්ති:

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

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

යටින් පවතින අනුකලනය වර්ගය නොසලකා මෙය ක්‍රියාත්මක විය යුතුය.


33
T: enum (ඇත්ත වශයෙන්ම T: struct, IConvertible නමුත් එය වෙනස් කතාවකි) යන සාමාන්‍ය වර්ගයක් සමඟ ගනුදෙනු කිරීමේදී මෙම තාක්ෂණය මට එහි වටිනාකම ඔප්පු කළේය.
aboy021

1
පැත්තේ ෂඩාස්රාකාර අගය මුද්‍රණය කිරීම සඳහා ඔබ මෙය වෙනස් කරන්නේ කෙසේද? මෙම උදාහරණයෙන් දශම අගය පෙන්වයි. ගැටළුව එය varවර්ගයට අයත් objectවන බැවින් ඔබට එය අගුළු ඇරීමට අවශ්‍ය වන අතර එය මා කැමති ප්‍රමාණයට වඩා අවුල් සහගත වේ.
මාර්ක් ලකාටා

2
මම ඔබට ආදර්ශය වෙනස් කළ යුතු ය හිතන්නේ object val = Convert...etcමේ varඔබගේ උදාහරණය සෑම විටම වනු ඇත object.
මෙෂ්

2
ImTimAbell මට සැබවින්ම පැවසිය හැක්කේ ගතිකව සම්පාදනය කරන ලද ඇස්පෙක්ස් පිටු (ඔබ .cs ලිපිගොනු සජීවී සේවාදායකයට යෙදවිය යුතු තැන) එක් එක් අගයට වෙනස් ලෙස පූර්ණ සංඛ්‍යා පවරන බවයි. එහි අර්ථය වූයේ එක් යන්ත්‍රයක් අනුක්‍රමිකකරණය කරන ලද වස්තූන්, වෙනත් යන්ත්‍රයක විවිධ අගයන් සමඟ අවතක්සේරු කිරීම සහ දූෂිත වීම ( පැය ගණනක් ව්‍යාකූලත්වයට හේතු වීම) ය. අපි එය එම්එස් සමඟ මතු කළ අතර විවිධ රාමු අනුවාදයන් හරහා ගොඩනඟන විට ස්වයංක්‍රීය උත්පාදක සංඛ්‍යා එක සමාන නොවන බව ඔවුන් පැවසූ බව මට මතකයි.
නික්

4
Im ටයිම්බෙල් වෙනම අවස්ථාවක, සංවර්ධකයෙකු යල්පැනගිය / භාවිතයට නොගත් එනුම් අගයක් මකා දැමූ අතර එමඟින් අනුක්‍රමයේ අනෙක් සියලුම අගයන් එකින් එක එළියට එයි. එනිසා අපගේ කේතීකරණ ප්‍රමිතීන්ට හැඳුනුම්පත් සෑම විටම නිශ්චිතව දක්වා ඇති බව අවශ්‍ය වේ, එසේ නොමැති නම් කේතය එකතු කිරීම / මකා දැමීම හෝ ස්වයංක්‍රීයව ආකෘතිකරණය කිරීම (උදා: අකාරාදී පිළිවෙලට වර්ග කිරීම) දත්ත දූෂණයට හේතු වන සියලු අගයන් වෙනස් කරයි. සියලුම එනූම් පූර්ණ සංඛ්‍යා පැහැදිලිව සඳහන් කරන ලෙස මම ඕනෑම කෙනෙකුට තරයේ අවවාද කරමි. ඒවා බාහිරව (දත්ත සමුදාය) ගබඩා කළ අගයන් සමඟ සහසම්බන්ධ වන්නේ නම් මෙය අතිශයින්ම වැදගත් වේ.
නික්

202

පොදු නියතයන් සහිත ස්ථිතික පන්තියක් ලෙස එය ප්‍රකාශ කරන්න:

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නියතයන් ඒවායේ දෘඩ අගයන් සමඟ සම්පාදනය කර ඇති නිසා මම භාවිතා කරමි . Stackoverflow.com/a/755693/492
CAD

97
මෙම විසඳුම සැබවින්ම තදින් ටයිප් කළ එනූම් වල සැබෑ ප්‍රතිලාභ ලබා නොදේ. මට අවශ්‍ය වූයේ ගේම්ස්ටේට්-එනුම්-පරාමිතිය නිශ්චිත ක්‍රමයකට යොමු කිරීමට නම්, සම්පාදකයා මට කිසිදු අන්තර් විචල්‍යයක් පරාමිතියක් ලෙස සම්මත කිරීමට ඉඩ නොදිය යුතුය.
thgc

12
ADCADBloke හරියටම ඔබ භාවිතා කරන්නේ ඇයිද යන්න constනොව static readonlyඔබ සංසන්දනය කරන සෑම අවස්ථාවකම ඔබ static readonlyවිචල්යයේ අගය ලබා ගැනීම සඳහා ක්රමයක් කැඳවන නිසා නොව constඔබ සමඟ වටිනාකම් වර්ග දෙකක් කෙලින්ම සංසන්දනය කරයි.
blockloop

3
@ brettof86 ඔව්, සං const ටකයක් වේගවත් වනු ඇත, සම්පාදන සීමාව කිසි විටෙකත් ගැටළුවක් නොවන්නේ නම් ඒ සියල්ල හොඳයි.
CAD bloke

2
Ack සැක් මම එය ඉතා හොඳින් පැහැදිලි කර නැත, compilation limitationමා අදහස් කළේ ඔබ එය සම්පාදනය කරන විට වටිනාකම දෘඩ කේතනය කර ඇති බැවින් එම අගයට යම් වෙනසක් සිදු වුවහොත් එය භාවිතා කරන සියලුම එකලස් කිරීම් නැවත සකස් කිරීම අවශ්‍ය වේ. භාවිතය පිළිබඳ ඔබ සමඟ එකඟ වීමට මම නැඹුරු වන්නේ අගයන් වෙනස් කිරීම දුරදිග යන ඇඟවුම් ඇති බැවිනි.
CAD bloke

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

ප්රති result ලය වනු ඇත value == 2.


34
තාවකාලික විචල්‍ය ප්‍රශ්නය අනවශ්‍යය.
ගිෂු

1
ඉතින් මේ වගේ දෙයක්. Get (Convert.ToInt16 (Question.Applications))
jim

6
ඔබට සරලවම දෙපැත්තටම දැමිය හැකිය; නැරඹිය යුතු එකම දෙය නම්, එනුම්ස් කිසිවක් බලාත්මක නොකිරීමයි (එම අංකය සමඟ කිසිදු ප්‍රශ්නයක් නොතිබුණද, එනුම් අගය 288 විය හැකිය)
මාක් ග්‍රෙවෙල්

im ජිම්: නැත, අගය පමණක් දමන්න: ප්‍රශ්න. ලබා ගන්න ((int) ප්‍රශ්නය. යෙදුම්);
ගුෆා

1
Ish ගිෂු ඔබට එය පැවසිය හැකිය ... සැක සහිත ය. ;)
ෆීලික්ස් ඩී.

81

අදාළ සටහනක, ඔබට 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
Minecraft modding හි Mixins භාවිතා කිරීමට පුරුදු වී සිටින අයෙකු ලෙස, දෙවැන්න පැහැදිලි ජයග්‍රාහකයා මෙන් පෙනේ.
සොලස්

41

ඔබ සිතනවාට වඩා එය පහසුය - එනූම් දැනටමත් int වේ. එය මතක් කළ යුතුය:

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

15
Nitpick: මෙම enum දැනටමත් int වේ. අනෙක් එනූම්ස් විවිධ වර්ග විය හැකිය - "enum SmallEnum: byte {A, B, C try" උත්සාහ කරන්න
mqp

9
ඇත්තවශයෙන්ම ඇත්ත. C # යොමුව: "සෑම ගණන් කිරීමේ වර්ගයකටම යටින් පවතින වර්ගයක් ඇත, එය වර්‍ගය හැර වෙනත් ඕනෑම අනුකලනයක් විය හැකිය."
මයිකල් පෙට්‍රොටා

34

උදාහරණයක්:

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, ආදිය.
තිමෝති ගොන්සාලෙස්

Im තිමෝති ගොන්සාලෙස් ඇත්ත වශයෙන්ම ගණන් බලන්නේ ඔබ ඒවායේ වටිනාකම නිශ්චිතව සඳහන් නොකරන්නේ නම් 1 ක් ලෙස ගණන් කරන්න;)
derHugo

@derHugo එය සංඛ්‍යාත්මක අගයන් 10 වන පදනම හෝ 2 වන පදනම ලෙස උපකල්පනය කරන්නේ නම් රඳා පවතී.
තිමෝති ගොන්සාලෙස්

Im තිමෝති ගොන්සාලෙස් උපකල්පනය කිරීමට එතරම් දෙයක් නැත ... මම පෙන්වා දුන්නේ ඔබ පැහැදිළිවම වෙනත් ආකාරයකින් අර්ථ දැක්වීම හැර ඒවා පෙරනිමියෙන් ගණන් ගනු 1ඇති බවයිint
derHugo

29

ආරක්ෂිත ඉදිකිරීම්කරුවන් සහ පූර්ව නිශ්චිත ස්ථිතික අවස්ථා සහිත පන්ති භාවිතා කිරීම වෙනුවට මම මෑතකදී මගේ කේතයේ එනූම් භාවිතා කිරීමෙන් ඉවත් වී සිටිමි ( රෝලෝෆ්ට ස්තූතියි - සී # වලංගු එනුම් අගයන් සහතික කිරීම - අනාගත ආරක්ෂණ ක්‍රමය ).

ඒ අනුව, මම දැන් මෙම ප්‍රශ්නයට එළඹෙන ආකාරය පහත දැක්වේ (ව්‍යංගයෙන් / සිට හැරවීම ඇතුළුව 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 හි විලාසිතා) එක් එක් සිද්ධිය විසඳීම සඳහා ඔබේ කේතය පුරා බොහෝ සිද්ධි ප්‍රකාශ කිරීමට වඩා වෙනස්ව.


සැ.යු: C # 6 විශේෂාංග භාවිතා කිරීම සඳහා යාවත්කාලීන කරන ලද පිළිතුර 2018-04-27; එනම් ප්‍රකාශන ප්‍රකාශන සහ ලැම්බඩා ප්‍රකාශන ශරීර අර්ථ දැක්වීම්. මුල් කේතය සඳහා සංශෝධන ඉතිහාසය බලන්න . අර්ථ දැක්වීම මඳක් අඩු වාචික බවට පත් කිරීමේ වාසිය මෙයට ඇත; මෙම පිළිතුරේ ප්‍රවේශය පිළිබඳ ප්‍රධාන පැමිණිලි වලින් එකක් විය.


2
මම හිතන්නේ එය පැහැදිලි වාත්තු කිරීම සහ එය මඟ හැරීම සඳහා ඔබ ලිවිය යුතු කේතය අතර ඇති වෙළඳාමයි. ක්‍රියාත්මක කිරීමට තවමත් ආදරය කරන්න, එය එතරම් දීර් not නොවන්නට ප්‍රාර්ථනා කරන්න. +1
ලන්කිමාර්ට්

3
මම මේ හා සමාන ව්‍යුහගත පන්ති කිහිපයක් භාවිතා කර ඇත්තෙමි. "මට පසුව මෝඩයෙකු වීමට ඉඩ නොදෙන්න" ක්‍රමවේදය අනුගමනය කිරීමට උත්සාහ කරන විට ඔවුන් පුදුම ක්‍රියා කරන බව මට පෙනේ.
ජේම්ස් හෝග්

21

විචල්යයක ගබඩා කර ඇති එනුම් අගය සඳහා පූර්ණ සංඛ්‍යාවක් ලබා ගැනීමට ඔබට අවශ්ය නම්, ඒ සඳහා වර්ගය වනු ඇත 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 ට වෙනස් වේ.


4
ලන්දේසි කේතීකරණය. අහෝ හිතවත.
WiseStrawberry

අවාසනාවට, මෙම ප්‍රවේශය ඔබ වැඩි වැඩියෙන් භාවිතා කරන විට දුර්වල ක්‍රියාකාරිත්වය ලබා දෙයි. මම එය මගේ යම් කේතයකින් උත්සාහ කළ අතර කාලයත් සමඟම මගේ යෙදුම මන්දගාමී හා මන්දගාමී විය, අඩු හා අඩු CPU භාවිතය. මෙයින් ඇඟවුණේ නූල් යමක් බලාපොරොත්තුවෙන් සිටින බවය - මම යම් ආකාරයක කසළ එකතු කිරීමක් උපකල්පනය කරමි, සමහර විට එනුම් පරාමිතිය ToInt32 () වෙත බොක්සිං කිරීම නිසා විය හැකිය. සරල int.Parse () වෙත මාරුවීමෙන්, මෙම දුර්වල ක්‍රියාකාරිත්වය මුළුමනින්ම ඉවත් කිරීමට මට හැකි වූ අතර, කේතය කොපමණ කාලයක් පැවතුනද, කාර්ය සාධනය එලෙසම පවතී.
ග්‍රෙග්

17

එනමම් අගයක් පවතින බව සහතික කර එය විග්‍රහ කිරීමට ඔබට පහත සඳහන් දෑ කළ හැකිය.

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

සමහර විට මට එය මඟ හැරී ඇත, නමුත් යමෙක් සරල ජනක දිගු කිරීමේ ක්‍රමයක් උත්සාහ කර තිබේද?

මෙය මට හොඳට වැඩ කරයි. ඔබට මේ ආකාරයෙන් ඔබගේ API හි වාත්තු කිරීම වළක්වා ගත හැකි නමුත් අවසානයේ එය වෙනස්වන ආකාරයේ මෙහෙයුමකට හේතු වේ. රොස්ලින් ක්‍රමලේඛනය සඳහා මෙය හොඳ අවස්ථාවක් වන අතර සම්පාදකයා ඔබට GetValue <T> ක්‍රමයක් සෑදිය යුතුය.

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

(Int) customFlag කිරීම වටේ ටයිප් කිරීම අඩු නිසාත් එකම දේ වැඩි වැඩියෙන් කරන නිසා ද?
ටිම් කීටින්

Re "සමහර විට මට එය මග හැරී ඇත, නමුත් යමෙක් සරල ජනක දිගු කිරීමේ ක්‍රමයක් උත්සාහ කර තිබේද?" : SixOThree පවසයි "භාවිතා කරන්න යම් දීර්ඝ ක්රමය වෙනුවට" හා Bronek පවසයි "ඔයාට ක්රියාත්මක කිරීම මගින් මෙය කළ හැකි දීර්ඝ ක්රමය ඔබේ අර්ථ නිඛිල වර්ගය" .
පීටර් මෝර්ටෙන්සන්

13

එය කිරීමට තවත් එක් ක්‍රමයක්:

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

එහි ප්‍රති result ලය වනු ඇත්තේ:

Name: Role, Value: 2

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

... කදිම ප්‍රකාශයකි.

ඔබට ප්‍රති result ලය int ලෙසට දැමිය යුතුය:

int Question = (int)QuestionType.Role

එසේ නොමැති නම්, වර්ගය තවමත් පවතී QuestionType.

මෙම තදබල මට්ටම C # ක්‍රමයයි.

එක් විකල්පයක් වන්නේ ඒ වෙනුවට පන්ති ප්‍රකාශයක් භාවිතා කිරීමයි:

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.


GetHashCode යනු එනුම් පොදු වෙස්
මුහුණෙන්

මේ සඳහා එකම "ගැසීමේ සැලසුමක්ද මතුවී" බව සටහන bool*, byte, ushort, int, සහ uint**. වෙනත් වර්ග සඳහා GetHashCode අගය වෙනස් කරයි, උදා: සමහර බිට්ෂිෆ්ට් සහ xors. (* 1/0, ** ඇත්ත වශයෙන්ම int වෙතට දමනු ලැබේ). නමුත් සියල්ලටම මෙය ඔබගේ පුද්ගලික කේතයක් මිස මෙය නොකරන්න.
AnorZaken

11

ඔබේ නිර්වචනය කරන ලද එනුම් වර්ගයට දිගු කිරීමේ ක්‍රමයක් ක්‍රියාත්මක කිරීමෙන් ඔබට මෙය කළ හැකිය :

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

මෙය වත්මන් enum අගයෙහි int අගය ලබා ගැනීම සරල කරයි:

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

හෝ

int value = Question.Role.getNumberValue();

6
බ්‍රොනෙක්, ඔබ කළේ ලිවීමට වැඩි කාලයක් ගතවන (සාමාන්‍ය නොවන btw) ව්‍යාප්ති ක්‍රමයක් හරහා තොරතුරු නොදක්වන සින්ටැක්ස් සෑදීමයි. ටෙට්‍රානුට්‍රෝන්ගේ මුල් විසඳුමට වඩා එය හොඳ වන්නේ කෙසේදැයි බැලීමට මා අසමත් වේ. අපි මෙය චැට් එකක් බවට පත් නොකරමු, උදව් සෑම විටම ස්ටැක් ඕවර් ප්‍රවාහයේදී සාදරයෙන් පිළිගනිමු. කරුණාකර මගේ අදහස ruc ලදායී විවේචනයක් ලෙස සලකන්න.
බෙන්ජමින්

3
බෙන්ජමින්, පළමුවෙන්ම, ඔබ මගේ අදහස මකා දැමුවේ ඇයි? ඔබේ තීරණ මට තේරෙන්නේ නැහැ - සමහර විට ප්‍රජාව හරහා වෙනත් අයෙකු මගේ අදහස් දැක්වීමට එකඟ වනු ඇත. දෙවනුව, මගේ විසඳුම ටෙට්‍රානුට්‍රොන්ගේ එක ආවරණය කරයි. නිවැරදිව එය පහසු සහ අඩු ලිවීමකි දීර් extension කිරීමේ ක්‍රමය ඉන්ටෙලිසෙන්ස් විසින් යෝජනා කරනු ලැබේ. එබැවින් ඔබේ තීරණය අපක්ෂපාතී සහ නියෝජිත නොවන බව මම සිතමි. මම ස්ටැක්ට සමාන පිළිතුරු බොහොමයක් දකින අතර එය හරි ය. කෙසේ වෙතත් මම මගේ විසඳුම භාවිතා කරන අතර සමහර අය අනාගතයේ දී මගේ විසඳුම තෝරා ගනු ඇත, නමුත් මෙම negative ණාත්මක කරුණු සොයා ගැනීම දුෂ්කර කරයි. බොහෝ විට එය නිවැරදි වන අතර පිටපත් නොවේ.
බ්‍රොනෙක්

4
Ro බ්‍රොනෙක් ඔබ මට පිං නොකළේ නම් ඔබ පිළිතුරු දුන් බවට කිසිදු සාක්ෂියක් මට නොලැබේ. මම ඔබේ අදහස මකා දැමුවේ නැත, මට හැකියාවක් හෝ එසේ කිරීමට අවශ්‍ය නැත. ඉන්නේ පිළිගැනීමේ ධජය එය මැදිහත්කරුවෙකු අවධානය සඳහා ඔබ සහ තවමත් ඇයි හෝ වඩා හොඳ ඇසීමට, - - ඉඩ කඩ, mod විසින් පැමිණ එය මකා දමන ලදී මත ඉල්ලා මෙටා Stack පමාණය . ඔබේ විසඳුම ගැන මට මතයක් ඇත්තේ ක්‍රමලේඛන ස්ථාවරයෙනි, එය මගේ දකුණේ පරිපූර්ණයි - අදහස් දැක්වීම ආරම්භ කිරීම සඳහා මෙයයි, එය පෞද්ගලිකව ගත යුතු නැත.
බෙන්ජමින් ග ru න්බෝම්

8

ඒ වෙනුවට දිගු කිරීමේ ක්‍රමයක් භාවිතා කරන්න:

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

භාවිතය තරමක් ලස්සනයි:

var intValue = Question.Role.IntValue();

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

ඇඳුම - "10. (කාඩ් ක්‍රීඩා) සාම්ප්‍රදායික ඇන්ග්ලෝ, හිස්පැනික් සහ ප්‍රංශ ක්‍රීඩා කාඩ්පත් වල ස්පාඩ්ස්, හදවත්, දියමන්ති හෝ සමාජශාලා වැනි වර්ණ හා / හෝ විශේෂිත ලාංඡන වලින් වෙන් කොට ඇති කාඩ්පත් පැකට්ටුවක සෑම කට්ටලයක්ම."
පීටර් මෝර්ටෙන්සන්

නියැදි කේතය පිළිබඳ පැහැදිලි කිරීමක් පිළිවෙලට වනු ඇත ( ඔබේ පිළිතුර සංස්කරණය කිරීමෙන් මිස අදහස් දැක්වීම් වලින් නොවේ).
පීටර් මෝර්ටෙන්සන්

ශුන්‍යය සාමාන්‍යයෙන් වෙන් කර ඇත්තේ / සැකසූ / නොදන්නා තත්වයක් සඳහා වන අතර එය එසේ අර්ථ දැක්වීම අසාමාන්‍යය
චැඩ් ග්‍රාන්ට්

7

භාවිත:

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

එහි ප්‍රති result ලය වනු ඇත value == 2.

මෙය සත්‍ය වන්නේ එනුම් එක ඇතුළත ගැලපෙන්නේ නම් පමණි int.


2
මෙය සත්‍යයක් වන්නේ පූර්ණ සංඛ්‍යාවක් නැවත ලබා දෙන intපරිදි, එනුම් පා course මාලාවක් තුළට ගැලපෙන්නේ නම් පමණි 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

මට සිතිය හැකි පහසුම විසඳුම 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);
    }
}

4

Int හෝ කුඩා enums සහිත මගේ ප්‍රියතම හැක්:

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

මම යෝජනා කිරීමට කැමති උදාහරණය “එනූමයකින් 'ඉන්ටර්' අගයක් ලබා ගැනීමට"

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

int answer = (int)Sample.Book;

දැන් පිළිතුර 1 වනු ඇත.



2

Enum int බවට පරිවර්තනය කරනවා වෙනුවට මෙය උත්සාහ කරන්න:

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
ප්‍රශ්නය C # සඳහා ය.
Ctrl S

2
මාතෘකාව පවසන්නේ "සී # හි එනූම් වෙතින් 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;
    }

කිසිදු කරුණාකර, ඔබ එක් රේඛාව Convert.Changetype (ඉ, e.GetTypeCode ()) හි මේ සියලු දේ හා වස්තුව නැවත, ගතිකත්වයන් කිසිදු අවශ්යතාවක් හෝ දීර්ඝ ක්රමය ලබා ගත හැකි
චැඩ් ප්රදාන

Convert භාවිතා කිරීමට මම එකඟ නොවෙමි. කාස්ට් එකක් භාවිතා කිරීම පහසු වනු ඇත. මගේ අභිප්‍රාය වූයේ වාත්තු කිරීමකින් තොරව ඕනෑම එනුම් ප්‍රමාණයක් එහි වටිනාකමට පරිවර්තනය කිරීමට හැකිවීමයි. ආශ්‍රිත සියලු කාස්ට් වෙනස් කළ යුතු එයිනම් වර්ගය වෙනස් කිරීමට මෙය ඉඩ දෙයි - නමුත් මෙය සිදු වන්නේ කවදාද? දිගු කිරීමේ ක්‍රමය නිවැරදිව ක්‍රියා කරයි. කෙසේ වෙතත්, මට එය සමඟ ගැටළුවක් ඇත, එය ගතික බැවින්, අනුකූලයාට චෙක්පත ටයිප් කළ නොහැක (සමස්ත ප්‍රකාශය සඳහාම පෙනෙන පරිදි) එයින් අදහස් වන්නේ ධාවනය වන විට වර්ග පරීක්ෂාව සිදු වන බවයි - හොඳ විසඳුමක් නොවේ. මම හිතන්නේ මම ආපහු යන්නම්.
ජෙෆ්

1
මෙම කේතය විකාර සහ කිසිවක් ඉටු නොකිරීම නිසා එය වාත්තු කිරීම සඳහා භාවිතා කරන්නැයි මම නොකියමි. මෙම විසඳුම ඉවත් කිරීමට මම නිර්දේශ කරමි
චැඩ් ග්‍රාන්ට්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.